你几乎把它弄好了.您需要定义坐标的3D网格.创建单个向量不是正确的方法.你当然可以在这里使用interp3.尝试做:

[X,Y,Z] = meshgrid(1:213, 1:100, 1:140);

Vq = interp3(M, X, Y, Z);

请注意,我已经交换了行(100)和列(213)限制,因为第一个参数水平前进,而第二个参数垂直前进.

此外,通过以这种方式使用interp3,我们假设X,Y和Z的限制在1:213,1:100和1:140之间.如果您提供超出这些限制的任何值,您将获得NaN.有几种方法可以避免这种情况:

>在末尾指定样条标志以允许样条外推

>如果要调整矩阵的大小(就像调整图像大小一样),那么目前没有可以通过这种方式调整3D矩阵大小的内置方法.你必须自己写这个.

如果要执行步骤2,可以执行以下操作.

首先,您需要确定每个维度的比例因子.基本上,这是每个维度的输出大小与原始输入大小的比率.

在此之后,您创建一个2D网格,其限制受输入矩阵的原始大小限制,但此网格的大小将是输出矩阵的大小.比例因子在这里很有用,因为这有效地为我们提供了网格中每个值应该插值的内容.我们将创建新的坐标,从1到每个维度的输出大小,以1 / scaleFactor为增量.例如,如果我们想要将矩阵的大小加倍,则这是2的因子.如果我们的X和Y坐标分别从1到3和1到3,原始网格看起来像这样:

X = Y =

1 2 3 1 1 1

1 2 3 2 2 2

1 2 3 3 3 3

要加倍,这只是:

X = Y =

1 1.5 2 2.5 3 1 1 1 1 1

1 1.5 2 2.5 3 1.5 1.5 1.5 1.5 1.5

1 1.5 2 2.5 3 2 2 2 2 2

1 1.5 2 2.5 3 2.5 2.5 2.5 2.5 2.5

1 1.5 2 2.5 3 3 3 3 3 3

请注意,这会创建一个5 x 5的输出网格.为了使其加倍为6 x 6,您可以执行任何操作,但为了简单起见,只需复制最后一行和最后一列,以便:

X = Y =

1 1.5 2 2.5 3 3 1 1 1 1 1 1

1 1.5 2 2.5 3 3 1.5 1.5 1.5 1.5 1.5 1.5

1 1.5 2 2.5 3 3 2 2 2 2 2 2

1 1.5 2 2.5 3 3 2.5 2.5 2.5 2.5 2.5 2.5

1 1.5 2 2.5 3 3 3 3 3 3 3 3

1 1.5 2 2.5 3 3 3 3 3 3 3 3

这定义了用于调整大小的2D列网格.现在,这是在3D中调整大小的问题.我们能做的是在切片之间进行插值.我们可以使用MATLAB中的permute轻松完成此操作,我将在稍后向您展示如何执行此操作.因此,基本算法是这样的:

>确定所需输出矩阵的输出大小

>确定每个维度中的比例因子

>按照上述步骤为每个维度创建插值访问值的2D网格

>对于矩阵中的每个2D切片,使用interp2使用上述2D网格将每个切片的大小调整为输出行和列.

>之后,使用interp1和permute来调整第三维的大小.

不用多说了,这是执行此操作的代码:

%// Specify output size of your matrix here

outputSize = [100 213 140];

%//Figure out size of original matrix

d = size(M);

%//Scaling coefficients

scaleCoeff = outputSize ./ d;

%//Indices of original slices in 3D

z = 1:d(3);

%//Output slice indices in 3D

zi=1:1/scaleCoeff(3):d(3);

%//Create gridded interpolated co-ordinates for 1 slice

[X,Y] = meshgrid(1:1/scaleCoeff(2):d(2), 1:1/scaleCoeff(1):d(1));

%//We simply duplicate the last rows and last columns of the grid if

%//by doing meshgrid, we don't get exactly the output size we want

%//This is due to round off when perform 1/scaleCoeff(2) or

%//1/scaleCoeff(1). We would be off by 1.

if size(X,1) ~= outputSize(1)

X(end+1,:) = X(end,:);

Y(end+1,:) = Y(end,:);

end

if size(X,2) ~= outputSize(2)

X(:,end+1) = X(:,end);

Y(:,end+1) = X(:,end);

end

%//For each slice...

M2D = zeros(outputSize(1), outputSize(2), d(3));

for ind = z

%//Interpolate each slice via interp2

M2D(:,:,ind) = interp2(M(:,:,ind), X, Y);

end

%//Now interpolate in 3D

MFinal = permute(interp1(z,permute(M2D,[3 1 2]),zi),[2 3 1]);

%//If the number of output slices don't match after we interpolate in 3D, we

%//just duplicate the last slice again

if size(MFinal,3) ~= outputSize(3)

MFinal(:,:,end+1) = MFinal(:,:,end);

end

MFinal将是您最终的插值/调整大小的3D矩阵.在3D中插值的关键方法是置换方法.这将做的是,对于z的每个值,我们将生成2D切片值.因此,如果我们在z = 1处有切片而在z = 2处有一个切片,如果我们想要找到切片z = 1.5处的值的2D网格,这将生成使用信息创建这些插值的2D切片.在z = 1和z = 2之间.我们首先调用permute来执行此操作,然后进行另一个permute调用以撤消我们的排列并获取原始尺寸.

matlab三维数组的输出,八度 – Matlab中的三维(3D)矩阵插值相关推荐

  1. python三维数组怎么表示_python – numpy中的三维数组

    你有一个截断的数组表示.让我们看一个完整的例子: >>> a = np.zeros((2, 3, 4)) >>> a array([[[ 0., 0., 0., 0 ...

  2. 三维荧光学习记录--在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI)

    三维荧光学习记录–在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI) 注:本文仅作为自己的学习记录以备以后复习查阅 关于区域积分的简介,大家可以去看我之前的文章,这里就不赘述了,主要想 ...

  3. 三维荧光学习记录--在Origin中绘制三维荧光光谱图

    三维荧光学习记录–在Origin中绘制三维荧光光谱图 注:本文仅作为自己的学习记录以备以后复习查阅 记录一下如何在Origin中绘制三维荧光光谱图(数据分析的学习之路任重而道远啊~~) 一.数据准备 ...

  4. matlab 统计数组频数_利用MATLAB进行频率分析(统计数组中元素个数)

    在日常计算,工作中使用MATLAB经常会遇到这样的一个问题:如何统计数组中各数字(元素)出现的频数.频率和累积频率?本文就按照案例演示的方式做一个总结. 第一种方法:调用MATLAB自带的函数tabu ...

  5. matlab 思维数组_如何在Matlab中保存多维数组?

    I have an array M=(1000000,12,2,2). How do I write it to a file to work on later? save('filename.txt ...

  6. matlab绘制数组的正态分布,利用matlab产生正态分布数组

    利用matlab产生正态分布数组 思路 课本 2.6 节--"数字噪声的产生"中介绍了两种产生标准正态分布随机数列的方法: 1) 利用随机数字生成器产生 12 个 0~1 之间均匀 ...

  7. matlab里数组的赋值,arrays – MATLAB结构赋值数组

    我有一系列结构.让我们说 s(1).value,-,s(5).value. 我有一个值向量,让我们说vals = [1 2 3 4 5],我想分配给结构数组.所以用伪代码写我想要:s(:).value ...

  8. matlab中的三维可视化实现

    图形三维立体可视化在Matlab中的实现和处理 三维图形的绘制除了常用的网格图.表面图和等高线等方法外,Matlab还提供了一些立体可视化函数用于绘制更为复杂的立体和向量对象. 这些函数通常在三维空间 ...

  9. matlab 思维数组_matlab多维数组

    1. 一个三维数组由行. 列和页三维组成, 其中每一页包含一个由行和列构成的二 维数组. 2. 利用标准数组函数创建多维数组 A=zeros(4,3,2) 生成一个 4 行 3 列 2 页的三维全 0 ...

最新文章

  1. Rsync文件同步服务
  2. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
  3. ISA Server 2006的全自动无人职守安装
  4. 实车采集的数据重建场景_SIGGRAPH | 多机器人协同三维场景重建
  5. Python出现AttributeError: module ‘tkinter‘ has no attribute ‘messagebox‘,已解决
  6. Internet Explorer 8 Beta1 开始测试,且含简体中文版
  7. jQuery知识(转)
  8. 管家婆辉煌II盘点功能操作流程
  9. 5G时代车联网的通信协议——C-V2X
  10. 计算机中文件无法删除,电脑文件无法删除怎么办?强制删除文件的方法
  11. ad采样做按键开关_基于ad采样电路的多路开关量采集装置及其采集方法
  12. 商业银行的设立与组织形式-单一银行制、分支银行制、持股公司制、连锁银行制、代理银行制...
  13. 视频会议,远程协助平台接入亮亮视野AR眼镜,UVC摄像头方案
  14. 企业微信如何实现PC端扫码登录第三方网站
  15. Druid连接池耗尽问题排查总结
  16. Chrome 技术篇-未安装的crx插件源码查看,crx类型文件解压方法
  17. 好文分享 努力从何时开始都不晚 跟自己比 不断进步
  18. 使用webStorm创建一个vue项目
  19. 求多个数的最大公约数和最小公倍数,用三种方法实现。
  20. 如何下载外文期刊文献,怎么下载又快又省力!

热门文章

  1. 通过JS方式实现隐藏手机号码中间4位数
  2. 用户体验及视觉设计如同“美女”穿着“华丽”的外衣
  3. PHP函数处理字符串大全
  4. 3D点云基础知识(一)-初始入门-知乎整理(一)
  5. 求两圆相交面积(模板)
  6. 为什么要做语音聊天室
  7. Python读取CSV文件:UnicodeDecodeError: 'gbk' codec can't decode byte 0xba ....illegal multibyte sequence
  8. python处理nc数据_利用python如何处理nc数据详解
  9. 打开图片链接直接打开QQ对话框
  10. 【My Electronic Notes系列——放大电路与集成运算放大器】