Matlab - 从元胞数组中的 table 访问 Table 字段
Matlab - Accessing Table fields from a table in cell array
我在访问元胞数组中 table 的列时遇到问题。
我有一个如下所示的 matlab 函数:
function [tables, rthTables, iGateTables, lastValueTables] = dataEinlesen(~, tcoFiles)
tables = cell(4,4);
...
for ch
for pos = folder.channelData(ch + 1).mPlexPos
ch_pos = [ch + 1, pos + 1];
tableCyclceCorrOffset_n = allTableCycleCorrOffset{ch_pos};
test1 = tables{ch_pos};
test1 = test1.cycle_no;
test1 = tables{ch_pos}.cycle_no;
%tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) = tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) + cycleCorrections(1, ch + 1);
end
end
...
test1 行仅用于调试,我想要开始工作的是行:
tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) = tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) + cycleCorrections(1, ch + 1);
行
test1 = tables{ch_pos}.cycle_no;
我收到错误:中间大括号 {} 索引生成了一个包含 2 个值的逗号分隔列表,但它必须生成一个值才能
执行后续的索引操作。
之前的两行工作得很好:
test1 = tables{ch_pos};
test1 = test1.cycle_no;
并得到我想要的结果。
由于 returns 函数是我尝试访问的元胞数组,所以我也尝试使用控制台中的输出进行操作,结果同样有效:
tablesO = dataEinlesen(tcoFile)
test1 = tablesO{1,1}.cycle_no
那为什么不
test1 = tables{ch_pos}.cycle_no;
函数内部工作?我错过了什么?
编辑:
此时的表格是{2501x18 table, [], [], []; 2501x18 table, [], [], []; 2501x18 table, [], [], []; 2501x18 table、[]、[]、[]} 单元格,因此 2501x18 table 在 {1,1}、{2,1}、{3,1} 和 {4,1}
test1 = tables{ch_pos}
returns 一个 2501x18 table 和
test1 = test1.cycle_no
使 test1 成为 2501x1 双精度
同样如前所述,函数 returns tables 作为输出,当我在控制台中对输出执行相同的单行操作时:
test1 = tables{1,1}.cycle_no
它可以直接 returns 2501x1 double
编辑2:
一个完整的最小示例:
function tables = testTables()
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
tableData = zeros(2501,18);
tableData(:,1) = 0:2500;
tablesVariablesNames = {'cycle_no', 'V_on', 'V_hot', 'V_cold', 't_max', 't_min', 't_delta', 't_p', 't_coolant', 't_c_max', 't_baseplate', 'i_cycle', 'delta_v', 'delta_t_c', 'on_time', 'off_time', 'Duty', 'timestamp'};
tables = cell(4,4);
table_X = array2table(tableData, 'VariableNames', tablesVariablesNames);
for i=1:4
tables{i,1} = table_X;
end
test1 = tables{1,1};
test1 = test1.cycle_no;
test1 = tables{1,1}.cycle_no;
end
有问题的列与我的其他函数中的列完全相同。为简单起见,所有其他列都仅为 0。奇怪的是,它在这个例子中工作得很好。
编辑 3:
我已经找到问题,很快就会post在这里给出答案。
要让这条线生效:
test1 = tables{ch_pos}.cycle_no;
表达式“tables{ch_pos}”需要 return 正好是一个值。 “ch_pos”绝对是标量吗?
MATLAB 的规则允许在您的代码中更早地使用这种用法:
test1 = tables{ch_pos}
因为它只会将“tables{ch_pos}”return的第一个分配给“test1”。但如果您使用“.”,它就不会那样做。结果的运算符。
问题是第一个索引。
正如@malcolmwood76 和错误本身指出我的索引返回了 2 个结果
ch_pos = [1, 1];
test1 = tables{ch_pos};
这行的实际结果是:
test1 = tables{1}, tables{1}
这就是点索引对此不起作用的原因。我实际上需要做的是
ch_pos = [1, 1];
test1 = tables{ch_pos(1), ch_pos(2)};
%which would result in
test1 = tables{1,1}
我在访问元胞数组中 table 的列时遇到问题。 我有一个如下所示的 matlab 函数:
function [tables, rthTables, iGateTables, lastValueTables] = dataEinlesen(~, tcoFiles)
tables = cell(4,4);
...
for ch
for pos = folder.channelData(ch + 1).mPlexPos
ch_pos = [ch + 1, pos + 1];
tableCyclceCorrOffset_n = allTableCycleCorrOffset{ch_pos};
test1 = tables{ch_pos};
test1 = test1.cycle_no;
test1 = tables{ch_pos}.cycle_no;
%tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) = tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) + cycleCorrections(1, ch + 1);
end
end
...
test1 行仅用于调试,我想要开始工作的是行:
tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) = tables{ch_pos}.cycle_no(end - (tableCyclceCorrOffset_n(end)):end) + cycleCorrections(1, ch + 1);
行
test1 = tables{ch_pos}.cycle_no;
我收到错误:中间大括号 {} 索引生成了一个包含 2 个值的逗号分隔列表,但它必须生成一个值才能 执行后续的索引操作。
之前的两行工作得很好:
test1 = tables{ch_pos};
test1 = test1.cycle_no;
并得到我想要的结果。
由于 returns 函数是我尝试访问的元胞数组,所以我也尝试使用控制台中的输出进行操作,结果同样有效:
tablesO = dataEinlesen(tcoFile)
test1 = tablesO{1,1}.cycle_no
那为什么不
test1 = tables{ch_pos}.cycle_no;
函数内部工作?我错过了什么?
编辑:
此时的表格是{2501x18 table, [], [], []; 2501x18 table, [], [], []; 2501x18 table, [], [], []; 2501x18 table、[]、[]、[]} 单元格,因此 2501x18 table 在 {1,1}、{2,1}、{3,1} 和 {4,1}
test1 = tables{ch_pos}
returns 一个 2501x18 table 和
test1 = test1.cycle_no
使 test1 成为 2501x1 双精度
同样如前所述,函数 returns tables 作为输出,当我在控制台中对输出执行相同的单行操作时:
test1 = tables{1,1}.cycle_no
它可以直接 returns 2501x1 double
编辑2:
一个完整的最小示例:
function tables = testTables()
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
tableData = zeros(2501,18);
tableData(:,1) = 0:2500;
tablesVariablesNames = {'cycle_no', 'V_on', 'V_hot', 'V_cold', 't_max', 't_min', 't_delta', 't_p', 't_coolant', 't_c_max', 't_baseplate', 'i_cycle', 'delta_v', 'delta_t_c', 'on_time', 'off_time', 'Duty', 'timestamp'};
tables = cell(4,4);
table_X = array2table(tableData, 'VariableNames', tablesVariablesNames);
for i=1:4
tables{i,1} = table_X;
end
test1 = tables{1,1};
test1 = test1.cycle_no;
test1 = tables{1,1}.cycle_no;
end
有问题的列与我的其他函数中的列完全相同。为简单起见,所有其他列都仅为 0。奇怪的是,它在这个例子中工作得很好。
编辑 3:
我已经找到问题,很快就会post在这里给出答案。
要让这条线生效:
test1 = tables{ch_pos}.cycle_no;
表达式“tables{ch_pos}”需要 return 正好是一个值。 “ch_pos”绝对是标量吗?
MATLAB 的规则允许在您的代码中更早地使用这种用法:
test1 = tables{ch_pos}
因为它只会将“tables{ch_pos}”return的第一个分配给“test1”。但如果您使用“.”,它就不会那样做。结果的运算符。
问题是第一个索引。
正如@malcolmwood76 和错误本身指出我的索引返回了 2 个结果
ch_pos = [1, 1];
test1 = tables{ch_pos};
这行的实际结果是:
test1 = tables{1}, tables{1}
这就是点索引对此不起作用的原因。我实际上需要做的是
ch_pos = [1, 1];
test1 = tables{ch_pos(1), ch_pos(2)};
%which would result in
test1 = tables{1,1}