2017-04-08 5 views
0

次の数からなるGRと呼ばれる入力としてN行M列を持ちます:-3,0,2,4,7,10,12 そして私はベクトルを返す。 M = 1の場合、入力を返すだけです。行列から要素を削除し、平均を計算する

M> 1の場合、行列から最低の数値を削除し、残りの数値の平均を計算する必要があります。 ただし、行の数値の1つが-3の場合、出力には-3が返されます。

私の問題点:

forループを作成することはできますか?私は最低を削除しようとしたときに

for i=1:length(GR(:,1)) If length(GR(1,:))==1 GR=GR end If length(GR(1,:))>1 x=min(GR(i,:))=[] % for removing the lowest number in the row GR=sum(x)/length(x(i,:))

私だけの行の数字のいずれかがあるかどうかを検出-3、その後、平均値を計算するのではなく、その値を返すとする方法のいずれかのアイデアを持っていませんx = min(GR(i、:))を使用して行列の数値matlabは私にこのエラーマッサージ「削除は既存の変数が必要です。

答えて

0

あなたは、これらの機能にNan年代、nanmeanany、およびdim引数を使用することができます。

% generate random matrix 
M = randi(3); 
N = randi(3); 
nums = [-3,0,2,4,7,10,12]; 
GR = reshape(randsample(nums,N*M,true),[N M]); 
% computation: 
% find if GR has only one column 
if size(GR,2) == 1 
    res = GR; 
else 
    % find indexes of rows with -3 in them 
    idxs3 = any(GR == -3,2); 
    % the (column) index of the min. value in each row 
    [~,minCol] = min(GR,[],2); 
    % convert [row,col] index pair into linear index 
    minInd = sub2ind(size(GR),1:size(GR,1),minCol'); 
    % set minimum value in each row to nan - to ignore it on averaging 
    GR(minInd) = nan; 
    % averaging each rows (except for the Nans) 
    res = nanmean(GR,2); 
    % set each row with (-3) in it to (-3) 
    res(idxs3) = -3; 
end 
disp(res) 
+0

あなたは多分、私はMathWorks社のMATLABのヘルプコマンドーを使用しているが、私はminColとminIndは – Ryan

+0

を何idxs3、かなりわからないんだけど、コードのいくつかを説明することができ、私はそれぞれの行を説明するコメントを追加しました。それでもまだ十分ではないかどうか教えてください。 – user2999345

0

は、私がブレーク機能に置きます。 -3の値を検出するとすぐにループから切り離されます。同じことが他の機能にも当てはまります。

i、j(M * N)の行列であることに注意してください。ループを変更する必要があるかもしれません。

for i=1:length(GR(:,1)) 

if GR(i,1)==-3 
GR=-3 
break 
end 

If length(GR(1,:))==1 

GR=GR 
break 
end 

If length(GR(1,:))>1 
x=min(GR(i,:))=[] % for removing the lowest number in the row 
GR=sum(x)/length(x(i,:)) 
end 

end 
+0

まず、意思決定の階層を明確に定義する必要があります。優先順位のリストを作成し、ループを書くのは簡単です。 – Joseph

関連する問題