我编写了这个matlab代码,以便连接从多矩阵数组中提取的矩阵的所有列的集成结果。
“datimf”是由100个矩阵组成的矩阵,每个矩阵224 * 640,垂直连接。 在第一个循环中,我选择每个矩阵。 在第二个循环中,我整合了所选矩阵的每一列 获得一行640个元素。 第三个循环必须垂直连接先前计算的所有行。
无论如何,我总是遇到第三个循环的问题。错误在哪里?
singleframe = zeros(224,640);
int_frame_all = zeros(1,640);
conc = zeros(100,640);
for i=0:224:(22400-224)
for j = 1:640
for k = 1:100
singleframe(:,:) = datimf([i+1:(i+223)+1],:);
int_frame_all(:,j) = trapz(singleframe(:,j));
conc(:,k) = vertcat(int_frame_all);
end
end
end
答案 0 :(得分:1)
另一种方法是在不使用任何显式循环的情况下执行此操作(编辑以响应下面的rayryeng评论。同样值得注意的是,使用cellfun
可能不比显式循环更有效。):
nmats = 100;
nrows = 224;
ncols = 640;
datimf = rand(nmats*nrows, ncols);
% convert to an nmats x 1 cell array containing each matrix
cellOfMats = mat2cell(datimf, ones(1, nmats)*nrows, ncols);
% Apply trapz to the contents of each cell
cellOfIntegrals = cellfun(@trapz, cellOfMats, 'UniformOutput', false);
% concatenate the results
conc = cat(1, cellOfIntegrals{:});
从user2305193的答案中获取灵感,这里有一个更好的无循环"解决方案,基于重塑矩阵并在适当的维度上应用trapz
:
datReshaped = reshape(datimf, nrows, nmats, ncols);
solution = squeeze(trapz(datReshaped, 1));
% verify solutions are equivalent:
all(solution(:) == conc(:)) % ans = true
答案 1 :(得分:0)
我想我明白你想要什么。第三个循环是不必要的,因为内循环和外循环都是100个元素长。另外,你拥有它的方式是分配singleframe
多次,因为它不依赖于内部循环j
或k
。在int_frame_all
完成填充之前,您还尝试将conc
添加到int_frame_all
。
除此之外,不需要j
循环,因为trapz可以立即对整个矩阵进行操作。
我认为这更接近你的意图:
datimf = rand(224*100,640);
singleframe = zeros(224,640);
int_frame_all = zeros(1,640);
conc = zeros(100,640);
for i=1:100
idx = (i-1)*224+1;
singleframe(:,:) = datimf(idx:idx+223,:);
% for j = 1:640
% int_frame_all(:,j) = trapz(singleframe(:,j));
% end
% The loop is uncessary as trapz can operate on the entire matrix at once.
int_frame_all = trapz(singleframe,1);
%I think this is what you really want...
conc(i,:) = int_frame_all;
end
答案 2 :(得分:0)
您似乎正在处理视频中的帧。
根据我的经验,最有效的方法是将datimf
重塑为三维。使用reshape
命令可以轻松实现这一点。
vid=reshape(datimf,224,640,[]);
中的某些内容应该会让你在这方面走得更远,第三个维度就是时间。 vid(:,:,1)
然后会显示视频的第一帧。