2016-09-27 6 views
2

私はmatlabでいくつかの並べ替えを行うが、evalに依存する次のコードがあります。これははるかに大きなコードセットの一部であり、私はここに記述できるように簡略化しました。基本的には、関数evalを取り除く簡単な方法を探していますので、コードの前半でparfor文を使うことができます。透明 - matlabのEVALを置き換えます

詳細にそれを試す機会で
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'については、[変数からフィールド名を生成する](http://se.mathworks.com/help/matlab/matlab_prog/generate-field-names-from-variables.html)を見てください。第2の缶は綴りが綴られているだけで、文字列は必要ありません。 –

+0

ありがとうございます。このMWEのコードを変換するときにタイプミスがありました。今それはうまくいくはずです。あなたが投稿したリンクを見ていきます。 – phdstudent

+0

実際、これについて間違っていると思いますか?番号のついたフィールドを持つ構造体は奇妙に見えます。あなたは何を解決しようとしていますか? –

答えて

1

ないが、ここではあなたの問題への一般的な答えである:

あなたは現在、構造体(またはフィールドのインデックスを置きますか? )。

これを行うのではなく、名前を固定してディメンションを追加するだけです。

myvar1のような変数を使用するのではなく、structのようにmyvar(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 

同等であるべきで、IはP1で使用するインデックスのマトリックスidsを生成します。

関連する問題