在for循环

时间:2018-02-02 15:43:34

标签: matlab for-loop matrix concatenation

我编写了这个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

3 个答案:

答案 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多次,因为它不依赖于内部循环jk。在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)然后会显示视频的第一帧。