2016-09-27 4 views
2

У меня есть следующий код, который выполняет некоторую сортировку по matlab, но полагается на eval. Это часть гораздо большего набора кода, и я упростил его, чтобы его можно было разместить здесь. В принципе, я ищу простой способ избавиться от функции eval, так что я могу использовать инструкцию parfor ранее в коде.Прозрачность - заменить EVAL в matlab

t = 1; 
N = 1500; 
BM = rand(N,1); 
P1 = rand(N,12); 
nport = 10; 
tSpan   = t : t + 11; 
pointer = round([1; N*.10; N*.20; N*.30; N*.40;N*.50; N*.60; N*.70; N*.80; N*.90; N]); % pointers used in sorting 
IndStru = struct('idp1', [], 'idp2', [], 'idp3', [], 'idp4', [], 'idp5',[],'idp6', [], 'idp7', [], 'idp8', [], 'idp9', [], 'idp10',[]); 


[ssize, sInd] = sort(BM);  clear ssize 
ids1 = sInd(pointer(1)  : pointer(2)); 
ids2 = sInd(pointer(2) + 1 : pointer(3)); 
ids3 = sInd(pointer(3) + 1 : pointer(4)); 
ids4 = sInd(pointer(4) + 1 : pointer(5)); 
ids5 = sInd(pointer(5) + 1 : pointer(6));  
ids6 = sInd(pointer(6) + 1 : pointer(7)); 
ids7 = sInd(pointer(7) + 1 : pointer(8)); 
ids8 = sInd(pointer(8) + 1 : pointer(9)); 
ids9 = sInd(pointer(9) + 1 : pointer(10)); 
ids10 = sInd(pointer(10) + 1 : pointer(11));  clear sInd 

for i = 1 : nport 
      eval(['IndStru.idp' num2str(i) '=ids' num2str(i) ';' ]); 
      eval(['p10(' num2str(i) ',' num2str(tSpan(1)) ':' num2str(tSpan(12)) ') = sum(P1(IndStru.idp' num2str(i) ', tSpan))']); 

end 
+0

Ваш пример не работает, в частности строка 24, а также отсутствующий символ 'for'. Что касается первого 'eval', посмотрите на [Generate Field Names from Variables] (http://se.mathworks.com/help/matlab/matlab_prog/generate-field-names-from-variables.html), второй может просто уточняйте, нет необходимости в струнах. –

+0

Спасибо. При преобразовании моего кода для этого MWE была опечатка. Теперь все должно быть хорошо. Я посмотрю на ссылку, которую вы опубликовали. – phdstudent

+0

На самом деле, я думаю, вы ошибетесь по этому поводу? Структуры с пронумерованными полями кажутся странными. Что вы пытаетесь решить. –

ответ

1

Не в возможности попробовать его в деталях, но вот общий ответ на ваш вопрос:

Вы в настоящее время положить индекс в имени из структуры (или поле?).

Вместо этого просто держите имена фиксированными и добавляйте размеры.

Так что вместо использования переменных, таких как myvar1, используйте struct, как myvar(1).

После того, как вы внесли это изменение, вам будет легко получить доступ ко всем вашим данным без eval.

0

Насколько я могу сказать следующее должно быть эквивалентно

t = 1; 
N = 1500; 
BM = rand(N,1); 
P1 = rand(N,12); 
nport = 10; 
tSpan = t : t + 11; 

[~, sInd] = sort(BM); 
ids = zeros(N/nport, nport); 
for i = 1:nport 
    ids(:,i) = sInd(((i-1)*N/nport +1):i*N/nport); 
end 

p10 = zeros(nport, 12); 
for i = 1 : nport 
    p10(i, tSpan) = sum(P1(ids(:,i), tSpan), 1);   
end 

Вместо того, чтобы использовать на структуру для хранения индексов сгенерировать матрицу ids индексов для использования в P1.