掩盖字符串上的双倍

masking a double over a string

这是 MatLab 中的一道题... 我有两个矩阵,一个是 (5 x 1 double) :

1   
2   
3   
1   
3 

第二个矩阵是一个(5 x 3 字符串),其中没有字符出现的空格:

a  
bc   
def   
g   
hij

我正在尝试获得一个输出,以便创建一个 (5 x 1 string) 并从矩阵二的每一行输出第 n 个值,其中 n 是矩阵一中的值。我不确定如何使用能够处理更大矩阵的掩码来执行此操作。我的目标矩阵将具有以下内容:

a   
c   
f   
g   
j

非常感谢您的帮助!!!

您可以通过多种方式完成此任务。我给你两个。

方法 #1 - 生成线性索引和访问元素

使用 sub2ind 生成一组线性索引,这些索引对应于您要在矩阵中访问的行和列位置。您会注意到列位置发生了变化,但行位置总是在您想要访问每一行时增加 1。因此,给定您的字符串矩阵 A,并且您要访问的列存储在 ind 中,只需执行以下操作:

A = ['a  '; 'bc '; 'def'; 'g  ';'hij'];
ind = [1 2 3 1 3];
out = A(sub2ind(size(A), (1:numel(ind)).', ind(:)))

out =

a
c
f
g
j

方法 #2 - 创建一个稀疏矩阵,转换为 logical 并访问

或者,您可以通过 sparse 创建一个稀疏矩阵,其中非零条目的行从 1 到您在 ind 中拥有的元素不等,列的变化​​方式如下你给了我们。

S = sparse((1:numel(ind)).',ind(:),true,size(A,1),size(A,2));
A = A.'; out = A(S.');

请注意,您正在尝试以行优先方式访问每个元素,但 MATLAB 将以列优先格式执行此操作。因此,我们需要转置我们的数据矩阵,也需要我们的稀疏矩阵并转置它。最终结果应该给你与方法 #1 相同的顺序。