Операция, которую вы выполняете, должна выглядеть примерно так:
table1 = table({'someData1';'someData2';'someData3';'someData4';'someData5'},...
{'a';'b';'a';'b';'a'},'VariableNames',{'SomeField','ForeignKey'});
table2 = table({'a';'b'},{'apple';'banana'},'VariableNames',{'Key','Data'});
table3 = join(table1,table2,'LeftKeys','ForeignKey','RightKeys','Key')
Это приводит к следующей таблице:
SomeField ForeignKey Data
___________ __________ ________
'someData1' 'a' 'apple'
'someData2' 'b' 'banana'
'someData3' 'a' 'apple'
'someData4' 'b' 'banana'
'someData5' 'a' 'apple'
А затем вы применяете какую-то операцию к столбцам SomeField
и Data
.
Я думаю, что эта join
функция была добавлена, чтобы облегчить ее использование для тех, кто знаком с SQL, но менее знаком с синтаксисом MATLAB.
Если вы все еще беспокоитесь о копировании больших объемов данных (как я уже говорил, это не так из-за отложенного копирования), вы можете получить столбец Data
выше, используя следующие операции на основе набора:
[~,index] = ismember(table1.ForeignKey,table2.Key);
data = table2.Data(index);
Здесь data
- это массив ячеек, идентичный table3.Data
. В любом случае, созданные здесь значения index
- это то, что SQL создаст внутри для этой операции JOIN. Если table1.ForeignKey
отсутствует в table2.Key
, соответствующее значение index
равно 0 (индексы MATLAB начинаются с 1). В этом случае вы не можете использовать index
непосредственно для индексации, вам нужно будет использовать дополнительный уровень индексации, чтобы получить только допустимые строки:
[valid,index] = ismember(table1.ForeignKey,table2.Key);
data1 = table1.SomeField(valid)
data2 = table2.Data(index(valid));
Обратите внимание, что table/join
использует ismember
точно таким же образом, затем копирует левую таблицу (что приводит к тому, что копия ссылается на данные во входной таблице из-за ленивого копирования) и добавляет столбцы для нее справа таблица.