Arrays 如何在Matlab中用第一列和第二列值作为索引得到数组中的第三列

Arrays 如何在Matlab中用第一列和第二列值作为索引得到数组中的第三列,arrays,matlab,Arrays,Matlab,我有一个包含三列的数组,如下所示: A B C 10 75 20 30 67 50 85 12 30 98 49 70 我有A和B值,我想得到相应的C值。 例如,如果我输入(30,67),它应该显示50。 Matlab有没有获得C值的技巧? (我的数据集非常大,我需要一种快速方法)尝试accumarray: YourMatrix = accumarray([A B],C,[],@mean

我有一个包含三列的数组,如下所示:

 A       B      C
 10      75     20 
 30      67     50 
 85      12     30
 98      49     70
我有A和B值,我想得到相应的C值。 例如,如果我输入(30,67),它应该显示50。
Matlab有没有获得C值的技巧?
(我的数据集非常大,我需要一种快速方法)

尝试
accumarray

YourMatrix = accumarray([A B],C,[],@mean,true);
这样,
YourMatrix
将是一个大小为
[max(a)max(B)]
的矩阵,在
YourMatrix(a(ind),B(ind))
处有
ind
所需索引
a
B

A = [10 30 85 98]';
B = [75 67 12 49]';
C = [20 50 30 70]';
YourMatrix = accumarray([A B],C,[],@mean,true);
ind = 2;
YourMatrix(A(ind),B(ind))
ans =
   50
这样,当
ab
中存在重复时,它将返回相应的
C
值,前提是
ab
的每个唯一对都具有相同的
C
值。
true
标志使
accumarray
输出稀疏矩阵,而不是完整矩阵。

您可以使用:

你得到的结果是

C =
50
30

请注意,代码假定
q
中的所有对都可以在
ABC
中找到,您可以创建一个稀疏矩阵。此解决方案仅在C不包含任何零且A和B是大于0的整数时有效

A = [10 30 85 98]';
B = [75 67 12 49]';
C = [20 50 30 70]';
S = sparse(A,B,C);
S(10,75) % returns corresponding C-Value if found, 0 otherwise.

将输入数据定义为

data   = [ 10      75     20 
           30      67     50 
           85      12     30
           98      49     70];
values = [ 30      67];
这应该很快:

index = data(:,1)==values(1) & data(:,2)==values(2); %//  logical index to matching rows
result = data(index,3); %// third-column value for those rows
如果有多个匹配的第三列值,则会给出所有匹配的第三列值


如果要同时指定多对值,并获得所有匹配结果,请执行以下操作:

index = any(bsxfun(@eq, data(:,1).', values(:,1)), 1) & ...
        any(bsxfun(@eq, data(:,2).', values(:,2)), 1);
result = data(index,3);
例如,给定

data   = [ 10      75     20 
           30      67     50 
           85      12     30
           98      49     70
           30      67     80 ];
values = [ 30      67
           98      49];
结果将是

result =
    50
    70
    80

只有在
A
B
中没有重复的情况下,才会起作用,否则
S(A,B)
将具有
C
值的总和。
sparse
应该更有效,请参见的答案。True。我更喜欢accumarray,因为它提供了更多选项,例如,当A和B包含重复时,您可以使用@mean。此解决方案创建一个大小为
[max(A),max(B)]
的矩阵,它很容易耗尽内存。尝试使用sparse也一样,尽管这将是一个稀疏矩阵。我更新了“true”标志以输出稀疏矩阵。最后一行可以很容易地变得更健壮
C=nan(size(locb));C(Lia)=ABC(locb(Lia),3)。然后为所有未找到的对返回
nan
。@Daniel您也可以使用
Lia
-
ismember
的第一个返回值,而不是
locb>0
。如果
值中有多个对呢?@Shai问题并没有这样说。在这种情况下,输出的范围甚至不清楚。但这是一个有趣的概括;我编辑了我的答案,其中包括我意识到这种方法比@Shai方法快得多,对吗?
result =
    50
    70
    80