4

次のような行列 M があります。

M = [   1, 2, 3, 0, 0;
        1, 2, 0, 0, 0;
        2, 3, 4, 5, 0;
        4, 5, 6, 0, 0;
        1, 2, 3, 4, 5;
    ]

A の各行の右端のゼロ以外の値を持つ列ベクトルを取得しようとしていますが、最初の列 == 1 を持つ行に対してのみです。

行のフィルターを計算できます。

r = M( :, 1 ) == 1;
> r = [ 1; 1; 0; 0; 1 ]

そして、「M の各行の右端のゼロ以外の値」の一連のインデックスがあります。

> c = [ 3, 2, 4, 3, 5 ]

探しているものを取得するために、これらを A のスライスでどのように組み合わせるのですか? 私は次のようなものを探しています:

A( r, c )
> ans = [ 3; 2; 5 ]

しかし、これを行うと、何らかの理由で 3x3 マトリックスが得られます。

4

5 に答える 5

1

私が考えることができる最短の方法は次のとおりです。

% Get the values of the last non-zero entry per row
v = M(sub2ind(size(M), 1:size(M,1), c))

% Filter out the rows that does not begin with 1.
v(r == 1)
于 2013-07-22T23:26:29.760 に答える
0

線形インデックスを使用してそれを行う方法は次のとおりです。

N = M';
lin_index = (0:size(N,1):prod(size(N))-1) + c;
v = N(lin_index);
v(r)
于 2013-07-23T08:20:16.393 に答える
0

使用できます

arrayfun(@(x) M(x,c(x)), find(r))

ただし、必要rでない限りc、他の目的で使用できます

arrayfun(@(x) M(x,find(M(x,:),1,'last')), find(M(:,1)==1))
于 2013-07-23T00:19:58.450 に答える