1

マトリックスの最大値が発生する前に、マトリックスの最小値を取得しようとしていました。行列データと行列 a の 2 つの行列があります。行列 a は、行列データのサブセットであり、行列データの最大値で構成されます。次のコードがありますが、明らかに何か間違っています。

edit:

行列 a は、行列データの最大値です。私はそれを次から導き出しました:

for x=1:size(data,1)
a(x)=max(data(x,:));
end
a=a'
clear x 

マトリックス b コード:

for x=1:size(data,1)
b(x)=min(data(x,(x<data==a)));
end
b=b'
clear x

matrix data   matrix a   matrix b
1  2   3  4      4        1
6  5   4  7      7        4
9  6  12  5     12        6

行列データで発生した行列を作成する前に発生したすべての最小値が必要です

4

2 に答える 2

1

きれいではありませんが、これがループなしでこの種のことを行うために私がこれまでに見つけた唯一の方法です。

ループに問題がない場合は、MATLABの組み込み配列ループ関数の最もコンパクトな使用法としてGuntherStruyfの回答をお勧めしますarrayfun

行の代わりに列の分が必要な場合は、転置などの一部が不要になる可能性があります...

[mx, imx] = max(data');
inds = repmat(1:size(data,2), [size(data,1),1]);
imx2 = repmat(imx', [1, size(data,2)]);
data2 = data;
data2(inds >= imx2) = inf;
min(data2');

注:データが必要ない場合は、追加のdata2変数を削除して、行数を減らすことができます。

したがって、これが何をするかを示すために(そして私が質問を正しく理解したかどうかを確認するために):

入力用

>> data = [1,3,-1; 5,2,1]

最小値を取得します:

>> min(data2')
ans = [1, inf]

つまり、各行の最大値の前に最小値のみが検出され、それ以外はに設定されましたinf

言葉で:

  • 各行について、最大のインデックスを取得します
  • 列インデックスの行列を生成する
  • repmat各行が最大のインデックスであるデータと同じサイズの行列を生成するために使用します
  • データを無限大に設定します。ここで、列インデックス>max_indexマトリックス
  • いつものように分を見つけます。
于 2012-08-02T14:05:44.923 に答える
1

短くてシンプル:

[a,idxmax] = max(data,[],2);
b = arrayfun(@(ii) min(data(ii,1:idxmax(ii))), 1:size(data,1));

これはと同じです

b=NaN(1,size(data,1)); % preallocation!
for ii=1:size(data,1)
    b(ii) = min(data(ii,1:idxmax(ii)));
end

最大値自体を無視する

本当に前にすべての最小値が必要な場合(最大値を含まない場合)、最大値が最初の数値である可能性があり、空行列の最小値を取得しようとします。解決策は、セル出力を使用することです。これは空にすることができます。

b = arrayfun(@(ii) min(data(ii,1:idxmax(ii)-1)), 1:size(data,1),'uni',false);

空のセルをNaNに置き換えます

空のセルをNanに置き換えてからマトリックスに戻す場合は、次を使用します。

b(cellfun(@isempty,b))={NaN};
b=cell2mat(b);

または、単に以前のバージョンを使用して、同じ結果b(ii)NaN等しい場合に置き換えます。a(ii)

b = arrayfun(@(ii) min(data(ii,1:idxmax(ii))), 1:size(data,1));
b(b'==a) = NaN

例:

data=magic(4)

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

出力:

a' = 16    11    12    15

b =
    16     5     6     4

b =[1x0 double]    [5]    [6]    [4]

セル出力を使用し、最大値自体も無視する2番目のソリューションの場合。



そしてところで:

for x=1:size(data,1)
    a(x)=max(data(x,:));
end
a=a'
clear x

で置き換えることができます

a=max(data,[],2);
于 2012-08-02T14:09:32.207 に答える