为快速访问创建双表索引



我有一个如下表:

  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的行1(=列1,因为表中的单元格(1,1)为true)。索引到行2中的另一个数组包含3,4,5,6(因为单元格(2,3),(2,4),(2.5),(2,6)为真)等等。。。

我阅读了Compact MATLAB矩阵索引表示法,并使用向量作为精确矩阵的索引,但我不能为其工作编写代码。

由于每个结果数组的大小不同,因此可以使用单元格数组
首先,您的样本数据实际上不是一个表,所以让我们做一个任意的表:

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]

假设您有以下矩阵

>> 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

如果你想收集这些矢量,你需要决定如何在什么样的结构中收集它们。

相关内容

  • 没有找到相关文章

最新更新