左辺のサイズが 100x1 で右辺のサイズが 0x1 であるため、代入を実行できません。

22 views (last 30 days)
matsuda.
matsuda. on 24 May 2023
Commented: matsuda. on 25 May 2023
post ( : , i ) = ・・・の行でエラーが出ましたが、右辺で0×1になっているというのが分かりません。
始めたばかりなので調べても分かりませんでした。解決方法を教えてください。
エラー:左辺のサイズが 100x1 で右辺のサイズが 0x1 であるため、代入を実行できません。
put_ment:struct 型の変数
A_m:double 型の変数
Post=zeros(100,490*5);
%%中略
n=0;
i=0;
for a=1:1
for b=1:3
for c=1:7
n=n+1;
for s=1:10
i=i+1;
Post(:,i)=getfield(put_ment, A{a,1}, B{b,1}, C{c,1}, {round(A_m(s,1,n,a): A_m(s,3,n,a)/100:A_m(s,2,n,a),0),(1:1)});
%%中略
end
end
end
end

Answers (1)

Atsushi Ueno
Atsushi Ueno on 24 May 2023
>解決方法を教えてください
まず原因を調べる必要があります。原因が判ればインデックス範囲の修正等で解決出来ると思います。
【あやしい所】下記の (開始値:増分:終了値) の関係が不正で [] (空ベクトル)になっていませんか?
round(A_m(s,1,n,a): A_m(s,3,n,a)/100:A_m(s,2,n,a),0)
  • (終了値 - 開始値)と増分の符号が逆だと、空の列ベクトル(サイズ 0x1)になります
  • 増分がゼロだと空ベクトルになります(下記で動作確認しました)
x = zeros(100,100);
x(1:0:100,1) % 増分がゼロになるとx([],1)、即ち 0x1 空の列ベクトルが出力される
ans = 0×1 empty double column vector
【その他考えられる原因】
Post()へ格納するput_mentの各フィールドのサイズは 100x1 になる事が期待されている様ですが、どこかにサイズが 0x1 のフィールド (空になっている箇所) がある様です。その場合、空ベクトルでしかアクセスしない限り問題の様なエラーは発生しないはずなので、あったとしても上記の問題と重複していると思います。
temp = getfield(put_ment, A{a,1}, B{b,1}, C{c,1},{round(A_m(s,1,n,a): A_m(s,3,n,a)/100:A_m(s,2,n,a),0),(1:1)});
Unrecognized function or variable 'put_ment'.
if ~all(size(temp) == [100 1]) % getfield関数で得られたデータサイズが[100 1]ではない場合
disp(['data size is not [100 1] @ put_ment.' A{a,1} '.' B{b,1} ',' C{c,1} '{' num2str(round(A_m(s,1,n,a): A_m(s,3,n,a)/100:A_m(s,2,n,a),0)) ',1}']);
end
Post(1:2,i)=size(temp)'; % Postにgetfield関数で得られたデータサイズを記録してみる
  1 Comment
matsuda.
matsuda. on 25 May 2023
ご回答ありがとうございます。
増分が0になっていることが原因だと思い、値を変えてみたのですが、a=1:1であるためそれ以下(0など)に設定すると
「位置 2 のインデックスが無効です。配列インデックスは正の整数または
logical 値でなければなりません。」
とエラーが出てしまいます。
インデックス範囲の修正について教えて頂きたいです。
よろしくお願いいたします。

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!