Re: [問題] 提取矩陣中大於0的數值到另一個矩陣

看板MATLAB作者 (攸藍)時間10年前 (2015/05/04 16:34), 10年前編輯推噓7(706)
留言13則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《shadow5402 (shadow5402)》之銘言: : 假設我目前有一個varible x : x = : 0 0 1 2 : 0 3 2 0 : 1 3 0 0 : 2 0 0 0 : 我希望將其中不等於0的部分移動到另外一varible y : 變成 : y = : 1 3 1 2 : 2 3 2 0 : 目前我的寫法是 : for k = 1:4 : for a = 1:2 : if x(k,1) > 0 : y(a,1) = x(k,1); : end : if x(k,2) > 0 : y(a,2) = x(k,2); : end : if x(k,3) > 0 : y(a,3) = x(k,3); : end : if x(k,4) > 0 : y(a,4) = x(k,4); : end : end : end : 但結果卻是 : y = : 2 3 2 2 : 2 3 2 2 : 請問我是哪裡寫錯了?又該怎麼改呢? : 謝謝。 你最主要的錯誤是不能用a那個迴圈... 會重複assign x中非零的值到y去 y = zeros(max(sum(x>0)), size(x, 1)); for k = 1:size(x, 2) tmp = x(:, k) > 0; if any(tmp) y(1:sum(tmp), k) = x(tmp, k); end end % 上面迴圈中,可以用另外一個迴圈代替, % tmp = x(x(k,:) > 0, k); % for a = 1:length(tmp) % y(a, k) = tmp(a); % end tmp = arrayfun(@(y) y{:}(y{:}~=0), mat2cell(x, size(x, 1), ones(1, size(x,2))), ... 'UniformOutput', false); maxSize = max(cellfun(@length, tmp)); y2 = cell2mat(cellfun(@(x) [x; zeros(maxSize-length(x), 1)], tmp, ... 'UniformOutput', false)); isequal(y, y2) % 1 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.27.107 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1430728467.A.BBF.html ※ 編輯: celestialgod (123.205.27.107), 05/04/2015 16:41:38

05/04 16:42, , 1F
非常謝謝你的幫忙!
05/04 16:42, 1F

05/04 17:02, , 2F
不好意思,我剛剛發現結果跟預期的有點不同。
05/04 17:02, 2F

05/04 17:03, , 3F
會變成 y = [1 3 1 2; 2 2 3 0],而不是[1 3 1 2; 2 3
05/04 17:03, 3F

05/04 17:03, , 4F
2 0]
05/04 17:03, 4F

05/04 17:24, , 5F
我想到了,改成y(1:sum(tmp), k) = x(tmp, k)就可以了
05/04 17:24, 5F

05/04 17:24, , 6F
感謝你的幫忙!
05/04 17:24, 6F

05/04 18:12, , 7F
或是把tmp = x(k, x(k,:) > 0);改為
05/04 18:12, 7F

05/04 18:12, , 8F
tmp = x(x(:,k)>0, k);
05/04 18:12, 8F
這部分,很抱歉,我那時候沒很仔細看,沒發現你是要每個column... 我寫成了每個row,我稍作修改之後,就會是正確的結果了

05/04 18:16, , 9F
不過我現在遇到一個問題,如果我要處理的矩陣不再是
05/04 18:16, 9F

05/04 18:17, , 10F
4x4,而是5x4,4x3甚至是120x4這類型的矩陣呢?
05/04 18:17, 10F

05/04 18:17, , 11F
我試了幾種方式,目前失敗中Orz
05/04 18:17, 11F

05/04 18:26, , 12F
呃..我成功了XD,用第二種方式就可以了,根本不用改
05/04 18:26, 12F

05/04 18:32, , 13F
第一種也行,改成tmp = x(:,k) > 0;
05/04 18:32, 13F
※ 編輯: celestialgod (123.205.27.107), 05/04/2015 18:51:43
文章代碼(AID): #1LHoyJk_ (MATLAB)
文章代碼(AID): #1LHoyJk_ (MATLAB)