24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1496  |  回复: 11

abingchem

木虫 (著名写手)


[交流] 【求助】如何提取矩阵前两行>5的数据?

假如有矩阵:A=magic(10);
现在要提取A前两行中大于5的元素,除了循环遍历还有更好的办法吗?
目前想到的是可以用逻辑数组得到前两行的逻辑数组,但后面怎么处理呢?

前提是不能将前两行元素提出来赋值给另一变量
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lds588

铁杆木虫 (著名写手)


★ ★ ★
abingchem(金币+1):谢谢参与
robert2020(金币+2):多谢应助!欢迎常来仿真模拟版交流! 2011-01-11 10:56:56
引用回帖:
Originally posted by abingchem at 2011-01-05 13:41:11:
假如有矩阵:A=magic(10);
现在要提取A前两行中大于5的元素,除了循环遍历还有更好的办法吗?
目前想到的是可以用逻辑数组得到前两行的逻辑数组,但后面怎么处理呢?

前提是不能将前两行元素提出来赋值给另一 ...

[r,c,v]= find(A(1:2,: ) > 5);
r,c为大于5的元素的行列标
2楼2011-01-05 13:56:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by lds588 at 2011-01-05 13:56:59:


[r,c,v]= find(A(1:2,: ) > 5);
r,c为大于5的元素的行列标

知道了r,c之后,怎么用这两个数组引用A的元素呢?谢谢
3楼2011-01-05 14:28:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by abingchem at 2011-01-05 14:28:42:


知道了r,c之后,怎么用这两个数组引用A的元素呢?谢谢

为什么A(r,c)这样的引用不能通过?
4楼2011-01-05 15:34:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem(金币+1):谢谢参与
引用回帖:
Originally posted by abingchem at 2011-01-05 15:34:13:


为什么A(r,c)这样的引用不能通过?

MATLAB中的数组、矩阵是以列为主序的。
用find返回的行列是一个列的数组,不能使用A( r, c )直接全部引用。
但是引用A前两行中满足条件的单个元素。
5楼2011-01-05 16:29:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by xiegangmai at 2011-01-05 16:29:18:


MATLAB中的数组、矩阵是以列为主序的。
用find返回的行列是一个列的数组,不能使用A( r, c )直接全部引用。
但是引用A前两行中满足条件的单个元素。

那怎么办才可以呢?看了其他论坛,除了循环遍历,似乎也没有好办法。
6楼2011-01-05 16:43:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★ ★ ★
abingchem(金币+1):谢谢参与
robert2020(金币+3):辛苦了! 2011-01-11 10:57:22
引用回帖:
Originally posted by abingchem at 2011-01-05 16:43:46:


那怎么办才可以呢?看了其他论坛,除了循环遍历,似乎也没有好办法。

关键是看你用做什么,需要以什么样的方式返回?

首先能确定的是不能得到矩阵,因为行列中元素个数不确定。
如果要一个一个引用,就用循环。
CODE:
A = magic( 10 );
[ r, c ]= find( A( 1 : 2, : ) > 5 );
n = length( r );

for i = 1 : n
B( i ) = A( r( i ), c( i ) );
end

如果直接返回一维数组,可以这样试试:
CODE:
A = magic( 10 );
[ m, n ] = size( A );
B = reshape( A( 1 : 2, : ), 1, 2 * n );
l = find( A( 1 : 2, : ) > 5 );
C = B( l );

[ Last edited by xiegangmai on 2011-1-5 at 21:14 ]
7楼2011-01-05 18:00:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lds588

铁杆木虫 (著名写手)



小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
Originally posted by abingchem at 2011-01-05 16:43:46:


那怎么办才可以呢?看了其他论坛,除了循环遍历,似乎也没有好办法。

楼上说的很明白了,我相信你看懂了~~~
8楼2011-01-05 22:41:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by xiegangmai at 2011-01-05 18:00:20:


关键是看你用做什么,需要以什么样的方式返回?

首先能确定的是不能得到矩阵,因为行列中元素个数不确定。
如果要一个一个引用,就用循环。

[code]
A = magic( 10 );
[ r, c ]= find( A( 1 : 2, : ) ...

看来结论是无论怎样得到的逻辑数组也好、或者位置索引也好,并不能对原矩阵直接引用~

多谢!
9楼2011-01-06 08:33:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by lds588 at 2011-01-05 22:41:16:

楼上说的很明白了,我相信你看懂了~~~

恩,相当明白!
10楼2011-01-06 08:36:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

abingchem

木虫 (著名写手)


引用回帖:
Originally posted by xiegangmai at 2011-01-05 18:00:20:


关键是看你用做什么,需要以什么样的方式返回?

首先能确定的是不能得到矩阵,因为行列中元素个数不确定。
如果要一个一个引用,就用循环。

[code]
A = magic( 10 );
[ r, c ]= find( A( 1 : 2, : ) ...

不如这样写了:
A=magic(10);
B=A(1:2,;
C=B(B>5);
11楼2011-01-06 08:38:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

uiui

新虫 (小有名气)


★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
xiegangmai(金币+2):辛苦了! 2011-01-07 21:58:54
lz提出的问题很有意思,我以前也碰到过,当然最直接的方法就是把子数组提出来。
如果硬要引用原数组,也有变通的办法:

1. 用ls提出的下标法,不过要把二维下标转为一维下标:
A=magic(10);
[r,c]=find(A(1:2,: )>5);
B=A(sub2ind(size(A),r,c))
这里注意,不能用 ind=find(A(1:2,: )>5); 直接得到一维下标,因为该一维下标是基于子数组的

2. 还可以用另一种方法,将得到的子数组的逻辑值补零,变为原数组的逻辑值再引用
A=magic(10);
C=A([A(1:2,: )>5;logical(zeros(8,10))])

[ Last edited by uiui on 2011-1-6 at 11:35 ]
12楼2011-01-06 10:43:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 abingchem 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见