2016-04-24 11 views
0

以下に示すように、私は、matlab parforコマンドを使用してページランクを並列化しようとしています。matlab parforを使用しているエラー

しかし、**でマークされており、また、下に書かれている行:

p_t1(L{j,i}) = p_t1(L{j,i}) +constant; 

は、このエラーの原因となっている。

「未定義関数 『p_t1』タイプの入力引数は ' int32 '"

私がコメントアウトすると、コードが機能します。 parforを通常のforに置き換えると、再び機能します。何が問題ですか?

おかげ

S='--------------------------------------------------'; 
n = 6; 
index=1; 
a = [2 6 3 4 4 5 6 1 1]; 
b = [1 1 2 2 3 3 3 4 6]; 
a = int32(a); 
b=int32(b); 
a=transpose(a); 
b=transpose(b); 
vec_len=length(a); 
%parpool(2); 

for i=1:vec_len 
    G(1,i)=a(i); 
    G(2,i)=b(i); 
    con_size(i)=0; 
end 
%n=916428 

for j = 1:vec_len 
    from_idx=a(j); 
    con_size(from_idx)=con_size(from_idx)+1; 
    L{from_idx,con_size(from_idx)}=b(j); 
end 
% Power method 
max_error=100; 
p = .85; 
delta = (1-p)/n; 
p_t1 = ones(n,1)/n; 
p_t0 = zeros(n,1); 
cnt = 0; 
tic 

while max_error > .0001 
    p_t0 = p_t1; 
    p_t1 = zeros(n,1); 

    parfor j = 1:n 
     constant=p_t0(j)/con_size(j); 
     constant1=p_t0(j)/n; 

     if con_size(j) == 0 
     p_t1 = p_t1 + constant1; 
     else 
     for i=1:con_size(j) 
      **p_t1(L{j,i}) = p_t1(L{j,i}) +constant;** 
     end 
     end 
    end 
    p_t1; 
    sum(p_t1); 
    p_t1 = p*p_t1 + delta; 
    cnt = cnt+1; 
    max_error= max(abs(p_t1-p_t0)); 
    %disp(S); 
end 
toc 

%delete(gcp) 
+0

'parfor'では、すべての反復はお互いに独立しているべきです。私はコードを反映させるために書き直すことができると思います。今は、 'index'変数の値がおそらく' p_t1'の範囲外であると思います。そのため、あなたはそのエラーを受けています。しかし、コードを実行することなく、私は確信することはできません。さて、もっと調べてみると、 'L 'の最大値は7であり、' p_t1'の長さは6であることが分かります。 –

+0

私はL {j}がベクトルリスト?)を、すべてのjについて異なるサイズで置き換えて、問題を引き起こしています。それが理由だろうか?どうすれば解決できますか? – Haris

+0

'L {j}'がベクトルであったとしても、 'p_t0(j)/ con_size(j)'は依然としてスカラー(単一の数字)なので、なぜ問題になるのかわかりません。 'L {j} 'のエントリが' p_t1'の長さよりも大きい理由を考えるべきです。 –

答えて

0

parforループ内の各変数は、いくつかのカテゴリーの1つにclassifiedでなければなりません。あなたのp_t1変数は、任意のものとして分類することはできません。 を使用して実行できる複数の反復にわたってこの変数に結果を累積しようとしているようです。これは、結果が反復の順序に依存しない場合(例のように見える)にのみ可能ですが、ドキュメントからわかるように、特定のタイプの式だけが縮小変数に使用できます。割り当て。特に、削減変数にインデックスを付けることはできません。左辺でも代入の右辺でも変わりません。

Matlabは、この問題を強調する警告とM-Lint(統計的コードアナライザ)警告もたくさん作成する必要があります。

Matlabがparforで使用されている各変数を許容カテゴリの1つに明確に分類できるように、コードを書き直す必要があります。

関連する問題