matlab functionにお​いて固定サイズになる​はずの出力が可変サイ​ズと認定される.

20 visualizzazioni (ultimi 30 giorni)
mochi
mochi il 16 Dic 2021
Commentato: Atsushi Ueno il 21 Dic 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' は可変サイズの行列と推定されますが、モデル エクスプローラーのプロパティでは継承されたサイズまたは固定サイズと指定されています。[可変サイズ] チェック ボックスをオンにし、サイズのフィールドで上限を指定してください。

Risposta accettata

Atsushi Ueno
Atsushi Ueno il 18 Dic 2021
Modificato: Atsushi Ueno il 19 Dic 2021
>どうしたら固定行列と認識されるかを教えてほしいです
【結論】
下記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=スカラと確定する為には、上記に加えAnn1DmaxQ_columnがスカラである事が必要
Q_columnもfind関数の出力なので、最初の要素のみ選択してスカラと判断できる形に変更します。
  5 Commenti
mochi
mochi il 21 Dic 2021
上記の件について自力で解決しました
一応解決法は
データの編集でMATLAB Function全体としての可変データはON
個々のアウトプットでの可変データはOFFにしました,
詳しくご解説いただき本当にありがとうございました.
Atsushi Ueno
Atsushi Ueno il 21 Dic 2021
お役に立てず申し訳ありません。どうしたら固定行列(今回はスカラ)と認識されるかを実践し、手元のMATLAB homeとSimulink(R2017a)で動作確認したのですが、おかしいですね。
そういえば下記について一つ心当りがあります。
EffMax = max(Ejoin,[],'all'); % EffMaxがスカラであると認識される模様
% (3) EffMax=スカラと確定 ('all'オプション付max関数の出力がスカラの為)
max関数の'all'オプションは「MATLAB® R2018b 以降で有効です」ので、私はこれをmax(max())に置き換えて実行しました。その結果、EffMaxはお手当無しでもスカラと認識されたので「'all'オプション付max関数の出力はスカラだ!」と判断しましたが、これは勘違いかもしれません。(環境が無く検証できません)
EffMax = EffMax(1);
の1行を追加する必要があったかもしれません。

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Prodotti


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!