【发布时间】:2018-12-27 16:23:53
【问题描述】:
我希望用来自矩阵“P”和“Q”的数据填充一个 N x M x W 矩阵“S”。它们在下面定义并在附图中说明。此外,我们确定 n_1 + n_2 = N, m
S = zeros(M,N,W);
P = rand(m,n_1,W);
Q = rand(m,n_2,W);
我希望以 3 个其他矩阵(“Line_num”、“P_col”和“Q_col”)指定的方式组合“P”和“Q”,如下所述和所附图像的中间部分。
P_col = randperm(N); P_col = P_col(1:n_1); % 1 x n_1 matrix
Q_col = setxor(P_col, 1:1:N); % 1 x n_2 matrix
Line_num 是由 W 个向量组成的矩阵,形式为 aa:1:bb,其中 bb-aa = m,并且为每个向量随机选择 aa。
重要的是,在这种情况下,所有这些矩阵中沿第 3 维的数据代表 W 个不同的测试用例,数据各不相同,不能相互混合。
要填写“S”,可以分两个合乎逻辑的步骤进行(尽管如果可以一次性完成,我会很高兴)
将 Q 和 P 组合成一个形状为 m x N x W 的中间矩阵 Y 交织他们的列。 “Q_col”中指定的列是 取自 Q(使用向量索引)并放入矩阵 Y(使用 向量值)。 P也是如此。
对于组成 Line_num 的每个 W 向量和组成 S 的数组, 使用向量 Line_num 中的值将 Y 展开到 S中的相应行,同时保持从上到下 顺序。
我希望在没有 for 循环的情况下实现这一点,因为我希望“矢量化”我的代码,从而提高其运行速度。
我看过this 帖子和this 帖子,这与我想要的相似。然而,它们更简单,因为要提取的数字是恒定的。也许类似的东西是合适的?
感谢您的帮助:)
Link to the image aforementioned
编辑:这是一个带有我想要的 for 循环的示例代码(我的问题是我想摆脱循环)
W = 4;
N = 10; n_1 = 4; n_2 = 6;
M = 20; m = 5;
P_col = [1,3,5,8]; % 1 x n_1 matrix
Q_col = setxor(P_col, 1:1:N); % 1 x n_2 matrix
line_num(:,:,1) = [1,5,10,15,18];
line_num(:,:,2) = [2,3,8,11,12];
line_num(:,:,3) = [4,7,8,14,19];
line_num(:,:,4) = [2,6,13,15,16];
S = zeros(M,N,W);
P = rand(m,n_1,W);
Q = rand(m,n_2,W);
for w=1:W
line_num_I = line_num(:,:,w);
S(line_num_I,Q_col,w) = Q(:,:,w);
S(line_num_I,P_col,w) = P(:,:,w);
end
【问题讨论】:
-
请提供您尝试过的 for 循环。有时代码比图像更能解释问题。
-
考虑
P_col =randi(N,1,n_1);创建重复的随机数。 -
是的,我刚刚意识到这一点。感谢您指出。另外,我按照您的建议添加了示例代码。
-
主要问题是
line_num_I = line_num(:,:,w),因为它从 w 的值变为另一个
标签: matlab multidimensional-array indexing vectorization