2015-04-25 575 views
1

我再也看不到這個bug了......也許(很可能是:-))還有更簡單快捷的方法... 我總結了我巨大的重要欄目數據幀在一個小的expData中(見下文)。在matlab中重塑矩陣

這個問題其實很簡單,但我只是盲目的解決它的易想法..

我的目標是重塑列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]; 

回答

0

您當前的代碼拋出一個錯誤,因爲循環迭代的數量得到在循環的開始確定。當你刪除expData的行時,你會耗盡行數來索引某個時間點。

快速解決方法是從後面開始循環,即使用for index = size(expData,1):-1:1。這樣,您可以安全地刪除行而不會遇到索引問題。

優雅的解決辦法是使用ismember以確定行刪除:

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

太棒了! 「ismember-fix」正是這個想法,我需要!非常感謝!這節省了我的晚上! :-) –