1

<106x25 double> のデータ セットがありますが、これは構造体内にあり、データをマトリックスに抽出したいと考えています。単純な FOR ループでこれを達成できると考えましたが、MATLAB の知識ではすぐに障害にぶつかりました。

これは私が持っている唯一のコードですが、この単純なコードを機能させるには、MATLAB について十分な知識がありません。

>> x = zeros(106,25); for i = 1:106, x(i,:) = [s(i).surveydata]; end
??? Subscripted assignment dimension mismatch.

's'非常に大きなファイル (800MB を超える) であり、<1 x 106 struct>. s.surveydataほとんどの行が <1 x 25 double> (行ベクトル IIRC) であり、それらのいくつかは空で、 のみを返す場所である、この小さな部分にアクセスする必要があると言えば十分[]です。

s.surveydatasurveydata含まれているすべての場所の結果を明らかに返し、s(106).surveydata最後の行の結果を返します。したがって、それをつかんs(1:106).surveydataでマトリックスに入れる必要がありxます。x = zeros(106,25)この状況で間違った方法で最初にマトリックスを作成していますか?

乾杯、お時間をありがとう!

ライアン

4

3 に答える 3

2

すべての調査データを配列に書き込む最も簡単でクリーンで最速の方法は、 CATを使用して直接連結することです。

x = cat(1,s.surveydata);

編集: 調査データが空の場合、要素xよりも行が少ないことに注意してくださいsxhas 要素と同じ量の行が必要な場合sは、次の操作を実行できます。

%# find which entries in s have data
%# note that for the x above, hasData(k) contains the 
%# element number in s that the k-th row of x came from
hasData = find(arrayfun(@(x)~isempty(x.surveydata),s));

%# initialize x to NaN, so as to not confuse the
%# real data with missing data entries. The call
%# to hasData when indexing makes this robust to an 
%# empty first entry in s
x = NaN(length(s),length(s(hasData(1)).surveydata);

%# fill in only the rows of x that contain data
x(hasData,:) = cat(1,s(hasData).surveydata);
于 2012-04-14T22:11:40.740 に答える
1

いいえ、ゼロの配列を作成することは正しくありません。実際、それは良い考えです。変数を使用する前に Matlab で変数を宣言する必要はありませんが、ループの場合、事前に割り当てると速度が向上します。

x = zeros(size(s), size(s(1)));

for i = 1:106
    if ~isempty(s(i).surveydata)
        x(i, :) = s(i).surveydata;
    end
end

あなたが望むものを達成する必要があります。

編集:OPはいくつかの行が空であることを示したので、彼が言ったように私はそれを説明しました。

于 2012-04-14T18:45:48.480 に答える
0

これはどうですか?何sですか?

s(i).surveydataがスカラーの場合:

x = zeros(106,25); 
for i = 1:106
x(i,1) = [s(i).surveydata]; 
end

それがあなたが望んでいることだと思いますが、まったく明確ではありません:

s(i).surveydata行ベクトルの場合:

x = zeros(106,25); 
for i = 1:106
x(i,:) = [s(i).surveydata]; 
end

s(i).surveydata列ベクトルの場合:

x = zeros(106,25); 
for i = 1:106
x(i,:) = [s(i).surveydata]'; 
end
于 2012-04-14T18:29:03.323 に答える