【问题标题】:reshape matrix in matlab在matlab中重塑矩阵
【发布时间】:2015-04-25 18:45:53
【问题描述】:

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

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

我的目标是将列 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];

【问题讨论】:

    标签: matlab matrix reshape


    【解决方案1】:

    您当前的代码会引发错误,因为循环迭代的次数是在循环开始时确定的。当您删除 expData 的行时,您会在某些时候用完要索引的行。

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

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

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

    【讨论】:

    • 太棒了! “ismember-fix”正是我需要的想法!非常感谢!这拯救了我的夜晚! :-)
    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多