Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab分配三维阵列的一维切片_Matlab - Fatal编程技术网

Matlab分配三维阵列的一维切片

Matlab分配三维阵列的一维切片,matlab,Matlab,如何在MATLAB中指定3d数组中的一维切片 我有一个名为“CD”的逻辑2d数组,它对应于我要设置的三维图像矩阵(RGB格式)的像素 CD = any(d, 3); CDM(CD) = 255; 因此,在本例中,“CDM”是一个3d矩阵,包含每个像素的R、G、B值(例如,它是一个771x457x3矩阵) 上述代码有效。它会生成我想要的红色像素的图像 但假设现在我想要生成,比如说,绿色或青色像素?如何访问“CDM”的第二层和第三层(绿色和蓝色值)?我试着分配 CDM(CD) = [0 255 2

如何在MATLAB中指定3d数组中的一维切片

我有一个名为“CD”的逻辑2d数组,它对应于我要设置的三维图像矩阵(RGB格式)的像素

CD = any(d, 3);
CDM(CD) = 255;
因此,在本例中,“CDM”是一个3d矩阵,包含每个像素的R、G、B值(例如,它是一个771x457x3矩阵)

上述代码有效。它会生成我想要的红色像素的图像

但假设现在我想要生成,比如说,绿色或青色像素?如何访问“CDM”的第二层和第三层(绿色和蓝色值)?我试着分配

CDM(CD) = [0 255 255];
但这会返回错误

In an assignment  A(:) = B, the number of elements in A and B must be the same.

为了使用这样的2D数组修改每个通道,您需要获取每个通道(作为2D数组),然后使用2D逻辑数组将所需的像素替换为所需的值,然后将其分配回数组

green = CDM(:,:,2);
green(CD) = 255;
CDM(:,:,2) = green;
或者,您可以执行以下操作来矢量化问题

replace_color = [0 255 255];
CDM = bsxfun(@times, ~CD, CDM) + bsxfun(@times, CD, reshape(replace_color, [1 1 3]))
解释

首先,我们使用
bsxfun
执行维度广播,并将
CDM
中的每个RGB像素与逻辑矩阵的逆(
~
)相乘。这将
CD
1
的所有像素设置为
0
,并将所有其他像素保留为其原始值(因为它们与
1
相乘)

然后,我们将
CD
乘以新颜色(重塑为1 x 1 x 3数组)以生成一个M x N x 3数组,其中
CD
1
的每个RGB向量是所需的RGB值,所有其他值都是
0

bsxfun(@times, CD, reshape(replace_color, [1 1 3]))
然后,我们将这两个值相加,在
CD
0
的地方保留RGB值,并在
CD
1
的地方用新值替换RGB值

bsxfun(@times, ~CD, CDM)
如果您使用的是R2016b或更高版本,则可以删除
bsxfun
,解决方案简化为:

CDM = (~CD .* CDM) + (CD .* reshape(replace_color, [1 1 3]));

这三种解决方案都奏效了!非常好的回答,谢谢。R2016有什么不同之处,您可以“删除
bsxfun
”?2016为数组操作自动扩展单例维度(?),这就是
bsxfun
所做的。@Floris有很多改进,但最突出的改进之一是单例维度的自动广播。。。。因此,是的,您可以删除
bsxfun
,MathWorks建议您这样做,因为这样会更快、更容易阅读和更高效。