【问题标题】:create index into double table for quick access为双表创建索引以便快速访问
【发布时间】:2016-08-01 17:34:30
【问题描述】:

我有一张如下表:

  1 2 3 4 5 6 . . . .
1 1 0 0 0 1 0 . . . .
2 0 0 1 1 1 1 . . . .
3 0 1 0 0 0 1 . . . .
4 1 0 0 0 0 0 . . . .
5 0 0 1 0 1 0 . . . .
. . . . . . . . . . .
. . .
. .
.

1,2,.... 是行和列的标题。我需要索引到表中,这意味着: 一个数组(向量),该数组(向量)索引到包含 1 的 row1 (= 列 1,因为在表中 cell(1,1) 为真)。另一个索引到 row2 的数组包含 3,4,5,6(因为单元格 (2,3),(2,4),(2,5),(2,6) 是真的)等等......

我准确地阅读了Compact MATLAB matrix indexing notationUse a vector as an index to a matrix,但我无法为其编写代码。

【问题讨论】:

  • A是表格还是矩阵?

标签: matlab matlab-table


【解决方案1】:

由于每个结果数组的大小不同,您可以使用元胞数组。
首先,您的示例数据并不是真正的表格,所以让我们任意创建一个:

T = table({'a' 'a' 'a' 'b' 'b'}.',{'X' 'Y' 'Z' 'X' 'Z'}.',(1:5).',...
    'VariableNames',{'UserId','productId','Rating'});

接下来,我们将所有“关键”列转换为分类数组:

T.UserId = categorical(T.UserId);
T.productId = categorical(T.productId);

然后我们使用这个分类数组来交叉制表:

cross_T = crosstab(T.UserId,T.productId)

现在我们在新矩阵中查找所有1

[r,c] = find(cross_T);

并使用arrayfun 按行收集它们:

% a function to return all 1 in row
row = @(x) c(r==x).';
% preform on all rows
r = arrayfun(row,1:size(cross_T,1),'UniformOutput',false).';

所以我们得到单元格数组r的输出:

r = 
    [1x3 double]
    [1x2 double]

并查找我们编写的特定用户的数据:

>> r{2}
ans =
     1     3

您是否希望它更具可读性可以转换为结构数组:

s = cell2struct(r,categories(T.UserId))

那么s 的输出将是:

s = 
    a: [1 2 3]
    b: [1 3]

【讨论】:

  • thank you.another question: 如果我有一张表(column1:UserId,column2:productId,column3:Rating 等),其中一行表示任何人给出评分(1,2,3, 4,5) 到任何产品。例如:>> 在这个表中是四个。我希望 A 的表索引包括 X 和 Y;对于 B inculde X ,....你能帮帮我吗?
  • @Eli,如果您还有其他问题,请将其作为另一个问题发布:) 这样在上下文中将更容易理解和回答
  • 具体来说,我了解您的数据的外观,但不是您想要的结果。
  • 对不起。另一个人给我负分,现在不幸的是我不能让新帖子。对不起...
  • 哪部分看不懂再解释一下?
【解决方案2】:

假设你有以下矩阵

>> A = randi([0,1], [5,5])
A =

   1   0   1   1   1
   1   0   1   0   1
   1   1   1   1   0
   0   1   1   0   1
   0   0   0   1   0

您可以通过以下方式分别找到每一行的向量

>> find(A(1,:))
ans =

   1   3   4   5

如果你想收集这些向量,你需要决定你想以什么样的结构来收集它们。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多