从给定的具有不同长度的字符串元胞数组创建矩阵
Create matrices from a given cell-array of strings with different lengths
我在一个元胞数组中有 3 个序列:
Input_cell= {'ABCD','ACD', 'ABD'}
S1= 'ABCD' % which means A<B<C<D
S2= 'ACD' % which means A<C<D % missing B in the full string of 'ABCD'
S3= 'ABD' % which means A<B<D % missing C in the full string of 'ABCD'
我想将 Input_cell
中的每个字符串转换为矩阵 M
(i
-by-j
),它必须满足以下条件:
M(i,j)
和M(j,i)
是随机的
M(i,i) = 0.5
M(i,j) + M(j,i) = 1
M(i,j) < M(j,i)
例如如果 A<B
那么 M(A,B) < M(B,A)
例如,如果我们有 S1 = 'ABCD'
(这意味着 A<B<C<D
),M1
矩阵将按如下所示:
A B C D
A 0.5 0.3 0.2 0.1
B 0.7 0.5 0 0.4
C 0.8 1 0.5 0.1
D 0.9 0.6 0.9 0.5
如果我们有S2 = 'ACD'
(这意味着A<C<D
),在'ABCD'
的完整字符串中缺少B
,我们将把值0.5
在矩阵中 B
的每个位置,M2
矩阵预计如下:
A B C D
A 0.5 0.5 0.2 0.1
B 0.5 0.5 0.5 0.5
C 0.8 0.5 0.5 0.1
D 0.9 0.5 0.9 0.5
如果我们有S3 = 'ABD'
(这意味着A<B<D
),在'ABCD'
的完整字符串中缺少C
,我们将把值0.5
在矩阵中 C
的每个位置,M3
矩阵预期如下:
A B C D
A 0.5 0.4 0.5 0.1
B 0.6 0.5 0.5 0.3
C 0.5 0.5 0.5 0.5
D 0.9 0.7 0.5 0.5
如何从给定的序列元胞数组创建上述那种矩阵?
首先,您需要了解如何仅针对单个序列执行此操作:
创建一个介于0.5
和1
之间的随机数矩阵:
M = 0.5*rand(4) + 0.5;
设置主对角线等于0.5
M(logical(eye(4))) = 0.5;
设M
的上三角等于1-下三角:
M(triu(true(4))) = 1 - M(tril(true(4))); %// Note the main diagonal doesn't matter...
找出缺少的字母并相应地设置行和列等于0.5
:
fullSeq = 'abcd';
idx = find(fullSeq == setdiff(fullSeq, 'abd'));
%// at this point you'll need to check if idx is empty first...
M(:,idx) = 0.5;
M(idx,:) = 0.5;
现在您可以对一个矩阵执行此操作,只需遍历元胞数组或将其封装到一个函数中并使用 cellfun
.
我在一个元胞数组中有 3 个序列:
Input_cell= {'ABCD','ACD', 'ABD'}
S1= 'ABCD' % which means A<B<C<D
S2= 'ACD' % which means A<C<D % missing B in the full string of 'ABCD'
S3= 'ABD' % which means A<B<D % missing C in the full string of 'ABCD'
我想将 Input_cell
中的每个字符串转换为矩阵 M
(i
-by-j
),它必须满足以下条件:
M(i,j)
和M(j,i)
是随机的M(i,i) = 0.5
M(i,j) + M(j,i) = 1
M(i,j) < M(j,i)
例如如果A<B
那么M(A,B) < M(B,A)
例如,如果我们有 S1 = 'ABCD'
(这意味着 A<B<C<D
),M1
矩阵将按如下所示:
A B C D
A 0.5 0.3 0.2 0.1
B 0.7 0.5 0 0.4
C 0.8 1 0.5 0.1
D 0.9 0.6 0.9 0.5
如果我们有S2 = 'ACD'
(这意味着A<C<D
),在'ABCD'
的完整字符串中缺少B
,我们将把值0.5
在矩阵中 B
的每个位置,M2
矩阵预计如下:
A B C D
A 0.5 0.5 0.2 0.1
B 0.5 0.5 0.5 0.5
C 0.8 0.5 0.5 0.1
D 0.9 0.5 0.9 0.5
如果我们有S3 = 'ABD'
(这意味着A<B<D
),在'ABCD'
的完整字符串中缺少C
,我们将把值0.5
在矩阵中 C
的每个位置,M3
矩阵预期如下:
A B C D
A 0.5 0.4 0.5 0.1
B 0.6 0.5 0.5 0.3
C 0.5 0.5 0.5 0.5
D 0.9 0.7 0.5 0.5
如何从给定的序列元胞数组创建上述那种矩阵?
首先,您需要了解如何仅针对单个序列执行此操作:
创建一个介于
0.5
和1
之间的随机数矩阵:M = 0.5*rand(4) + 0.5;
设置主对角线等于
0.5
M(logical(eye(4))) = 0.5;
设
M
的上三角等于1-下三角:M(triu(true(4))) = 1 - M(tril(true(4))); %// Note the main diagonal doesn't matter...
找出缺少的字母并相应地设置行和列等于
0.5
:fullSeq = 'abcd'; idx = find(fullSeq == setdiff(fullSeq, 'abd')); %// at this point you'll need to check if idx is empty first... M(:,idx) = 0.5; M(idx,:) = 0.5;
现在您可以对一个矩阵执行此操作,只需遍历元胞数组或将其封装到一个函数中并使用 cellfun
.