1

私には2つの問題があります。followinfコードをご覧ください

it=0:0.01:360;
jt=0:0.01:270;

LaserS=zeros(size(it,2)*size(jt,2),2);
p=1;
for m=it
    for n=jt
        LaserS(p,:)=[m,n];
        p=p+1;
    end
end

それは非常に遅く、また多くのメモリ(約7.7765e + 009バイト)を消費します。だから私はそれを実行することはできません。どうすればそれを改善し、メモリの問題を解決できますか。私は8GbRAMでwin764を使用しています。

4

6 に答える 6

2

あなたは何をしようとしているのですか?「形を変える」はあなたの問題を解決するはずです。

LaserS=zeros(size(it,2)*size(jt,2),2);
JT=reshape(repmat(jt,[1,numel(it)]),1,numel(jt)*numel(it));
IT=reshape(repmat(it,[numel(jt),1]),1,numel(jt)*numel(it));

LaserS = [JT.', IT.'];

アレイを事前に割り当てることで、メモリヒットを節約できます。それ以外の場合、ここではメモリの最適化は行われません。

于 2013-02-23T15:32:49.460 に答える
2

使用する値を少なくしない限り、メモリ使用量を減らすことはできません。0.01ではなく0.1ずつステップitアップできますか?jt

ループなしで結果マトリックスを作成する方法は次のとおりです。

LaserS = [rempat(it.', length(jt), 1), kron(ones(length(it), 1), jt.')];
于 2013-02-23T15:33:13.103 に答える
2

このコードは、実行後、972000000 x 2の形状のマトリックスになるという意味で、「何もしていない」ように見えLaserSます。これらの値を同時にメモリにロードする必要がある場合は、サイズとそれについてすることはあまりありません。

投稿したコードから直接推測できない私の最初のアプローチは、さらに処理を実行しながら「オンザフライ」でマトリックスデータを生成すると、プログラムの全体的な目標を達成できる可能性があるということですLaserS

お役に立てれば!

于 2013-02-23T15:47:59.957 に答える
1

これはそれを行う必要があります:

it = it(:);
jt = jt(:);

jt = repmat(jt,size(it,1),1)
it = repmat(it',size(jt,1),1);
it = it(:);

LaserS = [it, jt]
于 2013-02-23T15:37:01.150 に答える
1

ここですでに紹介した優れたソリューションに加えて、メモリを削減したい場合は、を使用する理由はありませんdoublesingle必要なメモリの半分を使用できます。ステップサイズ0.01を単位ステップにエンコードできます(つまりit=uint16(0:1:36000)、数値を整数としてエンコードするuint16と、メモリの4分の1のみが使用されます。

于 2013-02-24T09:31:47.617 に答える
0

Meshgridもこれをきれいに実行します。おそらく、(n * m)x 2のマトリックスに含めることを主張する場合は、形状を変更します。しかし、なぜあなたはそれが欲しいのですか?あなたは実際に何か他のものを探しているようです、そしてbsxfun(、it、jt')があなたが望むことをする可能性があります。

于 2013-02-24T09:46:23.037 に答える