作者celestialgod (攸蓝)
看板MATLAB
标题Re: [问题] 提取矩阵中大於0的数值到另一个矩阵
时间Mon May 4 16:34:25 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/MATLAB/M.1430728467.A.BBF.html
※ 编辑: celestialgod (123.205.27.107), 05/04/2015 16:41:38
1F:推 shadow5402: 非常谢谢你的帮忙! 05/04 16:42
2F:推 shadow5402: 不好意思,我刚刚发现结果跟预期的有点不同。 05/04 17:02
3F:→ shadow5402: 会变成 y = [1 3 1 2; 2 2 3 0],而不是[1 3 1 2; 2 3 05/04 17:03
4F:→ shadow5402: 2 0] 05/04 17:03
5F:推 shadow5402: 我想到了,改成y(1:sum(tmp), k) = x(tmp, k)就可以了 05/04 17:24
6F:→ shadow5402: 感谢你的帮忙! 05/04 17:24
7F:推 shadow5402: 或是把tmp = x(k, x(k,:) > 0);改为 05/04 18:12
8F:→ shadow5402: tmp = x(x(:,k)>0, k); 05/04 18:12
这部分,很抱歉,我那时候没很仔细看,没发现你是要每个column...
我写成了每个row,我稍作修改之後,就会是正确的结果了
9F:推 shadow5402: 不过我现在遇到一个问题,如果我要处理的矩阵不再是 05/04 18:16
10F:→ shadow5402: 4x4,而是5x4,4x3甚至是120x4这类型的矩阵呢? 05/04 18:17
11F:→ shadow5402: 我试了几种方式,目前失败中Orz 05/04 18:17
12F:推 shadow5402: 呃..我成功了XD,用第二种方式就可以了,根本不用改 05/04 18:26
13F:推 shadow5402: 第一种也行,改成tmp = x(:,k) > 0; 05/04 18:32
※ 编辑: celestialgod (123.205.27.107), 05/04/2015 18:51:43