我有一组数据< 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)
不正确创建矩阵吗?
干杯,谢谢你的时间!
赖安
答案 0 :(得分:2)
将所有调查数据写入数组的最简单,最干净,最快捷的方法是使用CAT直接对其进行分类:
x = cat(1,s.surveydata);
编辑:请注意,如果任何surveydata为空,x
的行数将少于s
的元素。如果您需要x
与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);
答案 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