.mat

8 ビュー (過去 30 日間)
美紗子 馬渕
美紗子 馬渕 2022 年 3 月 8 日
コメント済み: 美紗子 馬渕 2022 年 3 月 9 日
matlab で作成した、20000行×3列のtable配列をA.matで保存しました。
A.matを読み出し、20000行×3列のtable形式で利用したいと思っています。
①load(A.mat)とすると、table形式ではなくstructの形式で呼び出されてしまう。
loadの使用方法が間違っているか、別の関数を使うべきか。
②struct形式で呼び出してしまったため、struct2tableを使用して、table形式に変更したところ20000行×1列になってしまう。
原因がわからないため、理由を教えてほしいです。
よろしくお願いいたします。

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 3 月 8 日
まず①について回答するため、質問の状況を再現します
rng = 1:20000; lst = perms('abcdefgh'); Name = cellstr(lst(rng,:));
Age = randi([20 80],rng(end),1); Height = randi([140 180],rng(end),1); % テーブルの内容は適当です
T = table(Name,Age,Height); % 20000行×3列のtable配列を作成
save('A.mat','T'); % A.matで保存
New = load('A.mat') % 質問の現象を再現(構造体が出力された。フィールドTは元のテーブルTと同一内容)
New = struct with fields:
T: [20000×3 table]
% S = load(___) は、前述の構文グループのいずれかの入力引数を使って、データを S に読み込みます。
% filename が MAT ファイルの場合、S は構造体配列になります。
>loadの使用方法が間違っているか
⇒その使用方法(S = load(___)の形)は間違っていません。上記のように構造体を出力する仕様なのです。構造体にはテーブルと同じ変数名のフィールドがあり、そのフィールドは保存したテーブルと同じ内容です。
>別の関数を使うべきか
⇒NOです。先の回答のようにload関数をS = load(___)の形ではなくload(___)の形で使うべきです。尚その際、登録した変数名が既にワークスペースに存在した場合はそれを上書きしてしまうので注意が必要です。
load('A.mat'); % S = load(___)の形ではなくload(___)の形で使う
T % 元のテーブルTが再現された
T = 20000×3 table
Name Age Height ____________ ___ ______ {'hgfedcba'} 40 162 {'hgfedcab'} 42 140 {'hgfedbca'} 41 148 {'hgfedbac'} 52 174 {'hgfedacb'} 27 172 {'hgfedabc'} 53 179 {'hgfecdba'} 23 148 {'hgfecdab'} 61 157 {'hgfecbda'} 32 178 {'hgfecbad'} 58 179 {'hgfecadb'} 46 152 {'hgfecabd'} 74 141 {'hgfebdca'} 76 153 {'hgfebdac'} 53 179 {'hgfebcda'} 71 140 {'hgfebcad'} 57 161
  2 件のコメント
Hernia Baby
Hernia Baby 2022 年 3 月 8 日
なるほど、変数に格納してる可能性もありましたね
美紗子 馬渕
美紗子 馬渕 2022 年 3 月 8 日
ご回答ありがとうございました。
おっしゃられた通り、変数に格納していたため構造体配列で読み込みをしておりました。
変数を使用せずに、loadの関数を使用することでtable配列で読み込むことができました。
ありがとうございました。
不明瞭な質問にも関わらず、的確にご回答いただきありがとうございました!

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

その他の回答 (1 件)

Hernia Baby
Hernia Baby 2022 年 3 月 8 日
もしかしたら保存部分でひっかかってるかもしれません。
例えばほかの変数も保存している等が考えられます。
save はどのようになっていますでしょうか?
------
以下、table型で読み込まれていることを確認できるサンプルです。
サンプルを作ります
clc,clear,close all;
LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'};
Age = [38;43;38;40;49];
Smoker = logical([1;0;1;0;1]);
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
tableを作り、保存します
T = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
save("test.mat","T")
ワークスペースをすべて消去し、呼び出します
clear
load("test.mat")
  1 件のコメント
美紗子 馬渕
美紗子 馬渕 2022 年 3 月 9 日
ご回答ありがとうございました。
ご指摘いただいた事項を確認してみましたが、同じ方法で使用しておりました。
今回は、私のload関数の使用方法の間違いをご指摘いただいた方の回答を採用させていただきました。
ご協力いただき、大変ありがとうございました。

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

カテゴリ

Help Center および File Exchange行列および配列 についてさらに検索

タグ

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!