Matlab 使用squeeze函数提取多维矩阵的某一维

在图像处理领域,经常需要对每个像素提取特征,保存为一个三维矩阵。例如对大小为100*150的图像提取SIFT特征,就会得到100*150*128的三维矩阵(A)。如果想要索引任意一个像素(如坐标(2,3)的对应像素)的特征向量,直接对A索引A(2,3:)得到的是一个1*1*128的三维矩阵b,而不是一个向量,解决方法是使用squeeze函数。c=squeeze(b)得到的c就是128的列向量。例子如下:

1、随机生成一个三维矩阵a:

 >> a=rand(2,3,4)

a(:,:,1) =

    0.7655    0.1869    0.4456
    0.7952    0.4898    0.6463

a(:,:,2) =


    0.7094    0.2760    0.6551
    0.7547    0.6797    0.1626

a(:,:,3) =

    0.1190    0.9597    0.5853
    0.4984    0.3404    0.2238

a(:,:,4) =

    0.7513    0.5060    0.8909
    0.2551    0.6991    0.9593


2、直接索引坐标(1,1)会得到

>> b=a(1,1,:)

b(:,:,1) =

   &

要在 MATLAB 中从一个九维矩阵提取其中心的一个三维矩阵,我们需要明确几个关键点: ### 假设条件 假设这个九维矩阵 `A` 的每个维度大小都足够大,以便能够从中选取“中心”的部分。例如,如果某个维度的长度小于 3,则无法取出该维度上的三个元素。 我们可以通过以下步骤实现这一目标: --- ### 实现方法 #### 步骤 1:确定矩阵 A 的尺寸 ```matlab size_A = size(A); ``` 这将返回包含各个维度大小的一行向量 `[d1, d2, ..., d9]`。 #### 步骤 2:计算每个维度的中间索引范围 对于每一维,取其 **[n/2 - 1 : n/2 + 1]** 范围内的值(向下取整)。可以编写一个小函数来动态生成这些索引: ```matlab function indices = getCenterIndices(dim_size) if dim_size < 3 error('当前维度太小,不足以形成三微矩阵'); end center = floor(dim_size / 2); % 计算中间位置 indices = max(1, center-1) : min(center+1, dim_size); % 确保不越界 end ``` 然后应用此函数到所有维度上获取具体的切片索引。 #### 步骤 3:利用数组下标选择数据块 结合之前获得的所有维度对应的有效区间进行实际的数据切割操作: ```matlab center_indices = cell(1, ndims(A)); for i = 1:ndims(A) center_indices{i} = getCenterIndices(size_A(i)); end % 使用上述得到的index直接访问原多维数组指定区域内容构成新三维数组B B = squeeze(A(center_indices{:})); ``` 这里需要注意的是结果 B 可能会因为原始输入矩阵各方向尺度差异而呈现非立方体形状;另外若某些特定条件下产生的空集情况也需额外处理异常捕获逻辑等细节完善代码健壮性. --- ### 示例演示 假如现在有一个简单构造出来的测试用随机数填充版张量实例作为例子来看效果如何: ```matlab rng default; % 设置种子保证重现性 testMatrix = randi([0,5], [7,8,6,4,9]); % 创建一个示例性的五阶张量 (仅展示前五个维度) centralCube = extractCentralSubmatrix(testMatrix); disp("Extracted central cube:"); disp(centralCube); ``` 运行以上脚本将会显示出所截取出来的小型立体结构部分数值信息。 --- ### 总结说明 这种方法适用于大多数场景,并且易于调整适应不同需求变化的情况。通过合理设置边界条件检查机制还能进一步增强程序鲁棒性和通用性价值! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值