在matlab中重塑矩阵

reshape matrix in matlab

我再也看不到错误了...也许(很可能 :-) )还有一种更简单、更快捷的方法来做到这一点... 我在一个小的 expData 中总结了我庞大的数据框架的重要列(见下文)。

这个问题其实很简单,只是我对解决它的简单想法视而不见..

我的 objective 是将列 b、c、d 重塑为一列,之后 expData 看起来像 expData2。

如果有人能帮助我,我会很高兴。

到目前为止我的代码:

  a = [1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5]';
  b = [0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.8  0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9]';
  c = [0.4 0.4 0.4 0.4 0.4 0.6 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9 0.1 0.1 0.1 0.1 0.1]';
  d = [0.5 0.5 0.5 0.5 0.5 0.1 0.1 0.1 0.1 0.1 0.7 0.7 0.7 0.7 0.7 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3]';
  e = rand(25,1);
  f = rand(25,1);

  a2 = [2 3 4 2 3 4 2 3 4 2 3 4 2 3 4]';
  b2 = [0.3 0.4 0.5 0.4 0.6 0.1 0.5 0.8 0.7 0.8 0.9 0.2 0.9 0.1 0.3]';
  c2 = rand(15,1);
  d2 = rand(15,1);
  expData = horzcat(a,b,c,d,e,f); 
  expData2 = horzcat(a2,b2,c2,d2); % for explanation of my objective

  k = horzcat(expData(:,2),expData(:,3),expData(:,4))'; % How I wanted to do it
  expData(:,2:4) = [];
  k = reshape(k,[],1);
  for index = 1:size(expData,1)
        if expData(index,1) == 1
          expData(index,:) = [];
        end
        if expData(index,1) == 5
          expData(index,:) = [];
        end
   end
   k = k(1:size(expData,1),:);
   expData2 = [expData k];

您当前的代码会引发错误,因为循环迭代的次数是在循环开始时确定的。当您删除 expData 的行时,您 运行 行在某个时间点索引。

快速解决方法是从后面开始循环,即使用 for index = size(expData,1):-1:1。这样,您就可以安全地删除行,而不会 运行 陷入索引问题。

优雅的修复方法是使用 ismember 来识别要删除的行:

rows2remove = ismember(expData(:,1),[1 5]);
expDate(rows2remove,:) = [];