-2

自分のコンピューターにMatlabR2012aをインストールし、友人のコンピューターにMatlab R2009a(マルチスレッド)をインストールしています。私のコンピューターには2GBのRAMしかありませんが、友人のコンピューターには128 GBとより優れたプロセッサーがあるため、友人のコンピューターでコードを実行することにしました。

リモートデスクトップ接続プログラムを使用して彼のコンピューターに接続し、ドロップボックスからコードとデータセットをダウンロードして、コードを実行しました。しかし、1時間経ってもコードの実行が終了しませんでした。(私のコンピューターでは約20分かかりました。私の友人のシステムの方が私のシステムよりもはるかに優れていると思われる場合は、20分もかからないはずです。)その後、さらに数時間待ちましたが、実行は終了しませんでした。

次に、問題がどこにあるかを理解するために、コードを手作業で段階的に評価し、次のループの実行を完了できないことに気付きました。

l=1;
for n=1:max_t
    for m=1:t(1,n).numberofPoints
        x_t(l)=t(1,n).matrix(m,1);
        y_t(l)=t(1,n).matrix(m,2);
        z_t(l)=t(1,n).matrix(m,3);
        l=l+1;
    end
end
minx = min(x_t(:));
miny = min(y_t(:));
minz = min(z_t(:));

x、y、z座標で最小点を取得するのは単純なループです。(このループには何も問題はないと確信しています。PCでは正常に機能します。)構造体の最大点と最小点を取得するためにループは必要ないことはわかっていますが、MATLABは初めてで、あまり詳しくありません。したがって、それは私にとって最も簡単なオプションのように思えました。

私のRAMはそれ以降のプロセスには十分ではないので、私は本当に友達のコンピューターを使用できなければなりません。したがって、私はこの問題を解決する必要があります。

同じコードが私のコンピューターでは機能するが、友達のコンピューターでは機能しない理由は何でしょうか。

4

4 に答える 4

5

Matlab R2011aは、ループ内でアレイを拡張するときに劇的なパフォーマンスの向上をもたらしました。R2012aは、それらをさらに向上させたと思います。

したがって、R2009では、事前に割り当てていないため、ループの実行に非常に長い時間がかかりますx_t

コードを改善する方法は他にもあります。ここでは、事前割り当てを修正します。

l=1;

%# preallocate with NaN, so that the values don't interfere with
%# taking the minimum later
lMax = sum([t(1,1:max_t).numberofPoints)]);
[x_t,y_t,z_t] = deal(NaN(lMax,1));

for n=1:max_t
    for m=1:t(1,n).numberofPoints
        x_t(l)=t(1,n).matrix(m,1);
        y_t(l)=t(1,n).matrix(m,2);
        z_t(l)=t(1,n).matrix(m,3);
        l=l+1;
    end
end
minx = min(x_t(:));
miny = min(y_t(:));
minz = min(z_t(:));
于 2012-12-06T13:55:37.150 に答える
1

あなたが書いたコードはいくつかの理由で遅いです...あなたは事前に割り当てx_tたり友達になったりせず、代わりにループでそれらを成長させます。そして最後に、あなたはそれらに対して何もしませんが、それらの最大値を計算します...

私はduffymoに同意します。double-for-loop全体を取り除き、次のように記述してみませんか。

minx = min( [t(1,:).matrix(:,1)] )

また

minx = min( cellfun(@(x)min(x(:)), {t(1,:).matrix(:,1)}, 'uni',0) );

またはあなたのケースで機能するそれらのツールの他の順列?

于 2012-12-06T13:33:21.717 に答える
1

なぜそれがあなたの友人のコンピュータで実行されないのか分かりません。プロセッサとRAM以外に何か違うものがあることは明らかです。

なぜ誰かがあなたがしたことをコーディングするのだろうか。データをベクトルにロードする2つのループがあり、x、y、zの最小値を見つけます。値をループしているときに最小値を見つけてみませんか?minへの呼び出しは必要ありません。

私はMatlabにあまり詳しくありませんが、これを行うためになぜマトリックスからコピーする必要があるのか​​疑問に思います。行列の行は、ベクトルまたは配列と考えることができます。データを複製せずに、x、y、z列の最小値を検索できませんでしたか?

于 2012-12-06T13:12:38.787 に答える
0

かなり基本的なトラブルシューティングスキルを身に付けるまでは、コードのデバッグ(したがって、コードの記述とプログラミング全般)は非常に難しく、苦痛を伴い、まったく楽しいものではありません。私はあなたに十二回目を求めています:

それはどのくらい進歩しますか?実行を停止したとき(つまり、Ctrl-Cを押したとき)、?の値はl何ですか?

lの値が1の場合、Matlabライセンスに問題があり、奇妙に現れている可能性があります。それに取り組んでみてください。

それは進歩していますが、ゆっくりと進んでいますか?実行を停止すると、何size(x_t)ですか?

size(x_t)がl(またはlに近い)の場合、アレイは適切に初期化されていません。Jonasによるすばらしい返事を見てください。

率直に言って、私はすでにこの質問をあまりにもローカライズされているとして閉じることに投票しました。おそらく、問題とその結果を修正するために行ったアクションを強調するように(友人と彼のマシンと彼のRAMを強調する以外に)自分の側で何らかの努力が見られるように修正する必要があります。

于 2012-12-06T14:02:13.293 に答える