テーブルで変数への代​入や変数の作成を行う​には、テーブルの高さ​と行数が一致していな​ければなりません。

9 ビュー (過去 30 日間)
Yu
Yu 2021 年 9 月 24 日
コメント済み: Yu 2021 年 9 月 25 日
こんにちは。
1)7✕2のセルを作成し、セルの1列目に完成させたいtableを、2列目に抽出したい情報があるtableをいれてあります。
2)1日毎にセルの行を分けて格納しているため、どの行も同じ型のtableです。
3)しかし、5行目のデータだけ以下のようにエラーになってしまいます。
  どの変数(列)も、最終行までデータがあるのですが、このデータだけ上手くいかず困ってしまいました。
  原因がわかるかたがいらっしゃいましたら教えて下さい。
      D = cell(7,2); % 格納セルの作成
for k = 1:7
% data2を日付毎にセル1列目に格納
idx = data2.DATE == sprintf('2021/07/0%d',k+1);
D{k,1} = data2(idx,:);
% NavlogのtimeTblを日付毎にセル2列目に格納
idxx = timeTbl.Date == sprintf('2021/07/0%d',k+1);
D{k,2} = timeTbl(idxx,:);
% data2に緯度経度をNavlogのtimeTblから抽出
D{k,1}.Latitude = D{k,2}.Latitude(D{k,1}.timestamp_JST);
D{k,1}.Longitude = D{k,2}.Longitude(D{k,1}.timestamp_JST);
end
5行目の1列目が860252✕26列となっていますが、27〜29列目に、セル2列目からタイムスタンプを基準にデータを抽出する流れです。
↓以下はセル5行1列目のtableの最下部です。どの列も最終行までデータが入っているのですが、なぜこのエラーがでるのかが分かりません。。
  7 件のコメント
Yu
Yu 2021 年 9 月 25 日
そうなんです。またお世話になっております!

サインインしてコメントする。

採用された回答

Atsushi Ueno
Atsushi Ueno 2021 年 9 月 25 日
編集済み: Atsushi Ueno 2021 年 9 月 25 日
>原因がわかるかたがいらっしゃいましたら教えて下さい。
”E{k,2}.Latitude(E{k,1}.timestamp_JST)”は、セル2列目(抽出したいtimetable)の項目中、セル1列目(完成させたいtable)のtimestamp_JST列のタイムスタンプと合致する行を抽出する事を意図していると思うのですが、そうはなっておらず、毎回全行が抽出されているので「完成させたいtableの行数*抽出したいtimetableの行数」のベクトルとなってしまいます。これが原因です。E{k,1}.timestamp_JSTのindex参照を除けば、完成させたいtableと抽出したいtimetableの行数が合致する(2021/7/8を除く)のでエラーが出なくなりました。
load('samples.mat');
E = cell(7,2); % 格納セルの作成
for k = 1:1 % <<<<最初の1つだけ
% data2を日付毎にセル1列目に格納
idx = datasample.DATE == sprintf('2021-07-0%d',k+1);
E{k,1} = datasample(idx,:);
% NavlogのtimeTblを日付毎にセル2列目に格納
idxx = timeTblsample.Date == sprintf('2021-07-0%d',k+1);
E{k,2} = timeTblsample(idxx,:);
% data2に緯度経度をNavlogのtimeTblから抽出
E{k,1}.Latitude = E{k,2}(E{k,1}.timestamp_JST(1),2);
E{k,1}.Longitude = E{k,2}(E{k,1}.timestamp_JST(1),3);
E{k,1}
end
ans = 4×4 table
DATE timestamp_JST Latitude Longitude timestamp_JST Latitude timestamp_JST Longitude __________ ___________________ _______________________________ ________________________________ 2021-07-02 2021/07/02 07:38:02 2021/07/02 07:38:02 37.249 2021/07/02 07:38:02 138.21 2021-07-02 2021/07/02 07:38:02 2021/07/02 07:38:02 37.249 2021/07/02 07:38:02 138.21 2021-07-02 2021/07/02 07:38:02 2021/07/02 07:38:02 37.249 2021/07/02 07:38:02 138.21 2021-07-02 2021/07/02 07:38:02 2021/07/02 07:38:02 37.249 2021/07/02 07:38:02 138.21
「行をindex指定で、列を変数名で」指定する方法が判らないので両方ともindex指定で行いました。
tableにtimetableをくっ付けると上記のような形になってしまいました。
あと、抽出側に同じタイムスタンプのデータが複数ある場合全てのデータを拾ってしまうので、この処理方法を検討する必要がありそうです。1番目(2021/7/2)はたまたま行数が一致しただけで、k=1:7で繰り返すと途中でエラーが出ます。
  2 件のコメント
Yu
Yu 2021 年 9 月 25 日
さらに検討してくださりありがとうございます。
>"そうはなっておらず、毎回全行が抽出されているので「完成させたいtableの行数*抽出したいtimetableの行数」のベクトルとなってしまいます。これが原因です。"
E{k,2}.Latitude(E{k,1}.timestamp_JST) % 怪しい部分を確認
これをヒントにもう一度データを確認してみたところ、
抽出元に重複した時間データがあることが原因であることが分かりました。
uniqueで重複データを削除して実行したところ上手くいきました。
(なので、お渡ししたsampleのtimeTblも重複があったので上手く回らないわけですね)
E{k,1}.Latitude = E{k,2}.Latitude(E{k,1}.timestamp_JST);
つまり、左辺と右辺の行数が一致していなかったことが原因でした。(右辺のほうが行数が多かった)
主題のエラー文章を読んだだけではさっぱりだったので、もっとわかりやすい表現だと初学者としてはありがたいというのが今回の感想となりました。
ともあれ、今回も助けてくださりありがとうございました!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Find more on table in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!