matlab functionにおいて固定サイズになるはずの出力が可変サイズと認定される.
12 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
mochi
am 16 Dez. 2021
Kommentiert: Atsushi Ueno
am 21 Dez. 2021
単一の入力とワークスペースの関数を用いて4つの出力を得ようとしています.
出力はそれぞれスカラーであるため固定サイズになるのですが可変サイズに推定され実行できません.
入力を手打ちしてmatlabエディターからは問題なく実行できます.
どうしたら固定行列と認識されるかを教えてほしいです.
以下コードです.
function [calc_P,calc_alfa,EffMax,nm]= map(Q, Eov, Qout, deltap, Dmax, Evmat)
%入力はQ以外はワークスペースから得たパラメータ
%近傍値探索
B = abs(Qout - Q);
i1 = min(B);
Q_column = find(B == i1);
Ann1 = Qout(Q_column);
%位置探索
r = Eov(:,Q_column,:);
Ejoin =[r(:,:,1),r(:,:,2),r(:,:,3),r(:,:,4)] ;
Ejoin = squeeze(Ejoin);
EffMax = max(Ejoin,[],'all');
dis = find(Ejoin==EffMax);
%3次元配列探索
calc_alfa_num = fix(dis/400);
calc_alfa_num = double(calc_alfa_num);
%行探索
Q_row = (dis-400*calc_alfa_num)+1;
Q_row = double(Q_row);
calc_alfa = 0.25*(calc_alfa_num+1);
calc_P = deltap(Q_row);
nm = Ann1/(Dmax*calc_alfa_num*Evmat(Q_row,Q_column,calc_alfa_num+1)) ;
end
エラーメッセージ
データ 'calc_P' は可変サイズの行列と推定されますが、モデル エクスプローラーのプロパティでは継承されたサイズまたは固定サイズと指定されています。[可変サイズ] チェック ボックスをオンにし、サイズのフィールドで上限を指定してください。
1 Kommentar
Akzeptierte Antwort
Atsushi Ueno
am 18 Dez. 2021
Bearbeitet: Atsushi Ueno
am 19 Dez. 2021
>どうしたら固定行列と認識されるかを教えてほしいです
【結論】
コメントのリンク先:【つまづきポイント4】配列サイズのエラーが出る!
下記2行(A=A(1)の形)を追記し、出力4変数をスカラと判断できる形に変更できます。
Q_column = find(B == i1); % Q_columnがスカラである事が必要
Q_column = Q_column(1); % Q_columnはスカラと判断できる形に変更(ここに追記)
...
dis = find(Ejoin==EffMax); % disがスカラである事が必要
dis = dis(1); % disはスカラと判断できる形に変更(ここに追記)
また、引数のサイズを確定するにはassert関数を使います。今回はDmax:スカラとassertします。
assert(all(size(Dmax) == 1)); % Dmaxはスカラと判断できる形に変更(関数の冒頭に追記)
【詳細】
対象の変数が4つあり、関連する変数がスカラである事を追って行かないとならないので大変です。
calc_P = deltap(Q_row);
(1) calc_P:スカラと確定する為には、Q_rowがスカラである事が必要
Q_row = double((dis-400*calc_alfa_num)+1);
Q_row:スカラと確定する為には、disとcalc_alfa_numがスカラである事が必要
calc_alfa_num = double(fix(dis/400));
(2) calc_alfa_num=スカラと確定する為には、disがスカラである事が必要
EffMax = max(Ejoin,[],'all'); % EffMaxがスカラであると認識される模様
(3) EffMax=スカラと確定 ('all'オプション付max関数の出力がスカラの為)
dis = find(Ejoin==EffMax);
dis:スカラと確定する為には、find関数のヒット数(=出力サイズ)が1である事が必要
従ってfind関数の仕様を使ってマッチした数値の個数を制限すればdis=スカラと確定するはずです。
dis = find(Ejoin==EffMax, 1); % しかしこれだと何故か上手くいかない
dis = dis(1); % 追記⇒スカラと判断できる形に変更
しかしfind関数の出力がスカラと判断されず、結局添え字で値一つを選択するとdis:スカラと認識されました。
assert(all(size(Dmax) == 1)); % 関数の冒頭に追記⇒スカラと判断できる形に変更
%近傍値探索
B = abs(Qout - Q);
i1 = min(B);
Q_column = find(B == i1, 1); % find関数の出力サイズを1と指定しても認識されない
Q_column = Q_column(1); % 追記⇒スカラと判断できる形に変更
Ann1 = Qout(Q_column); % Q_columnがスカラならAnnもスカラと判断できる
%行探索
Q_row = double((dis-400*calc_alfa_num)+1);% dis,calc_alfa_num共スカラ⇒Q_rowもスカラ
nm = Ann1/(Dmax*calc_alfa_num*Evmat(Q_row,Q_column,calc_alfa_num+1)) ;
(4) nm=スカラと確定する為には、上記に加えAnn1とDmaxとQ_columnがスカラである事が必要
Q_columnもfind関数の出力なので、最初の要素のみ選択してスカラと判断できる形に変更します。
5 Kommentare
Atsushi Ueno
am 21 Dez. 2021
お役に立てず申し訳ありません。どうしたら固定行列(今回はスカラ)と認識されるかを実践し、手元のMATLAB homeとSimulink(R2017a)で動作確認したのですが、おかしいですね。
そういえば下記について一つ心当りがあります。
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/840580/image.jpeg)
EffMax = max(Ejoin,[],'all'); % EffMaxがスカラであると認識される模様
% (3) EffMax=スカラと確定 ('all'オプション付max関数の出力がスカラの為)
max関数の'all'オプションは「MATLAB® R2018b 以降で有効です」ので、私はこれをmax(max())に置き換えて実行しました。その結果、EffMaxはお手当無しでもスカラと認識されたので「'all'オプション付max関数の出力はスカラだ!」と判断しましたが、これは勘違いかもしれません。(環境が無く検証できません)
EffMax = EffMax(1);
の1行を追加する必要があったかもしれません。
Weitere Antworten (0)
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!