2017-09-21 82 views
-1

MATLAB(ビルドされた関数では使用できません)を反復して、特定の行列の各行の最大値を求めようとしています。私は行列全体の最大値を見つけることができましたが、行を分離して最大値を見つけることについてはわかりません(もう一度max()を使わずに)。max()を使わずに最大値を見つけるルーピング

私のループは現在、次のようになります。

for i = 1:size(A, 1) 
    for j = 1:size(A, 2) 
     if A(i, j) > matrix_max 
      matrix_max = A(i, j); 
      row = i; 
      column = j; 
     end 
    end 
end 

答えて

0

あなたはそれが各行について、それぞれ最大を取得するには、次の好きに変更することができます

% initialize 
matrix_max = zeros(size(A,1),1); 
columns = zeros(size(A,1),1); 

% find max 
for i = 1:size(A, 1) 
    matrix_max(i) = A(i,1); 
    columns(i) = 1; 
    for j = 2:size(A, 2) 
     if A(i, j) > matrix_max(i) 
      matrix_max(i) = A(i, j); 
      columns(i) = j; 
     end 
    end 
end 
+0

hey!答えてくれてありがとう。 1つの配列に出力するようにする方法や、それを変更するためにreshape()関数を使用する必要がありますか? –

3

あなたは、単一の、結果のベクトルをする必要はありません値。 になります。これを0に初期化します。 正の値がであることが分かっていない限り、ゼロに初期化しないでください。代わりに、-inf*ones(...)を使用して-infに初期化します。これは、すべての値が負の無限大よりも大きいためです。または(下のコードブロックを参照)Aの最初の列に初期化します。ベクトル化は、あなたの「ノー組み込み関数」ルールに違反していない場合は(それがMATLAB言語のほとんどを作って、問題ないはずですが)という

% Set up results vector, same number of rows as A, start at negative infinity 
rows_max = -inf*ones(size(A,1),1); 
% Set up similar to track column number. No need to track row number as doing each row! 
col_nums = zeros(size(A,1),1); 
% Loop through. i and j = sqrt(-1) by default in MATLAB, use ii and jj instead 
for ii = 1:size(A,1) 
    for jj = 1:size(A,2) 
     if A(ii,jj) > rows_max(ii) 
      rows_max(ii) = A(ii,jj); 
      col_nums(ii) = jj; 
     end 
    end 
end 

注意、あなたはループ

を外側(行)を削除することができます
rows_max = -inf*ones(size(A,1),1); 
col_nums = zeros(size(A,1),1); 
for jj = 1:size(A,2) 
    % Get rows where current column is larger than current max stored in row_max 
    idx = A(:,jj) > rows_max; 
    % Store new max values 
    rows_max(idx) = A(idx,jj); 
    % Store new column indices 
    col_nums(idx) = jj; 
end 

さらに、ループを1だけ短くし、最初の列をAに初期化することもできます。

rows_max = A(:,1);   % Set current max to the first column 
col_nums = ones(size(A,1),1); % ditto 
% Loop from 2nd column now that we've already used the first column 
for jj = 2:size(A,2) 
    idx = A(:,jj) > rows_max; 
    rows_max(idx) = A(idx,jj); 
    col_nums(idx) = jj; 
end 
関連する問題