あなたは、単一の、結果のベクトルをする必要はありません値。 はになります。これを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
hey!答えてくれてありがとう。 1つの配列に出力するようにする方法や、それを変更するためにreshape()関数を使用する必要がありますか? –