如何更改FOR循环中的行号...(MATLAB新手)

时间:2012-04-14 18:25:09

标签: matlab for-loop row

我有一组数据< 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的一小部分,其中大多数行是&lt; 1 x 25 double&gt; (行向量IIRC),其中一些是空的,只返回[]

s.surveydata显然会返回surveydata所包含的所有s(106).surveydata将返回最后一行结果的结果。因此,我需要抓住s(1:106).surveydata并将其放入矩阵x。在这种情况下,首先使用x = zeros(106,25)不正确创建矩阵吗?

干杯,谢谢你的时间!

赖安

3 个答案:

答案 0 :(得分:2)

将所有调查数据写入数组的最简单,最干净,最快捷的方法是使用CAT直接对其进行分类:

x = cat(1,s.surveydata);

编辑:请注意,如果任何surveydata为空,x的行数将少于s的元素。如果您需要xs具有相同数量的行,则可以执行以下操作:

%# 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);

答案 1 :(得分: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表示某些行是空的,我就像他说的那样解释了这一点。

答案 2 :(得分: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