透明度 - 在matlab中替换EVAL

时间:2016-09-27 10:18:36

标签: matlab eval transparency parfor

我有以下代码在matlab上进行一些排序,但依赖于eval。这是一组更大的代码的一部分,我已将其简化为能够将其放在此处。基本上,我正在寻找一种简单的方法来摆脱函数eval,以便我可以在代码中使用parfor语句。

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

2 个答案:

答案 0 :(得分:1)

没有机会详细尝试,但这是您问题的通用答案:

您目前将索引放在结构(或字段?)的名称中。

不要这样做,只需保持名称固定并添加尺寸。

因此,不要使用像myvar1这样的变量,而是使用像struct这样的myvar(1)

完成此更改后,无需eval即可轻松访问所有数据。

答案 1 :(得分: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

我没有使用结构来存储索引,而是生成要在P1中使用的矩阵ids