作者lihgong (人生,是一句引用句)
看板MATLAB
标题[心得] 用 Matlab 写 MEX 函数加速 vol.5
时间Sat May 19 14:55:29 2007
这一篇是我和朋友讨论怎麽处理 3-dimension 的输入
弄了一阵子, 我们讨论出一个满好用的 MACRO
可以把 (x, y, z) 转成 array 的 index
TWO_D_INDEX(dim_x, dim_y, x, y)
THREE_D_INDEX(dim_x, dim_y, dim_z, x, y, z)
举例来说, 有个 Matrix A 大小是 3x6
如果 A(3, 5) = 6
因为 C 语言的index从 0 开始, (3, 5) 转到 C 语言变成 (2, 4)
把(2, 4) 转成 data-array 的 index, 可以套用 TWO_D_INDEX() 这个 macro
TWO_D_INDEX(3, 6, 2, 4)
dim_x dim_y x y
把 MACRO 里的运算看懂, 并且实际验证
之後就不用烦恼这些麻烦的 index 转换了
----
另外这一篇 note 还有一个主题, 是取出 mxArray 里的 dimension 资讯
mxArray 里有两个栏位, 分别记录有几个 dimension, 以及每个 dimension 的大小
转成程式码, 就是类似下面的操作...
// Input dimension processing
input_num_of_dimensions = mxGetNumberOfDimensions(prhs[0]);
input_dim = mxGetDimensions(prhs[0]);
// print dimension information
printf("Number of dimensions of the input: %d\n", input_num_of_dimensions);
for(i=0; i<input_num_of_dimensions; i++)
printf("Length of dimension #%d is %d\n", i+1, input_dim[i]);
为什麽要取出 dimension 的资料?
因为要把 (x, y, z) 转成 data-Array index 时, 需要这些资料
所以这一小段程式码是必要的
----
最後是范例程式在做什麽
程式的输入是一个 3-D matrix
印出 (desired_index_x, desired_index_y, desired_index_z)
int desired_index_x = 32 -1;
int desired_index_y = 3 -1;
int desired_index_z = 160 -1;
每个数都减 1 的理由是 C 的 index 从 0 开始
喂给这个函数的输入也有特别设计, 如下
for i=1:32
for j=1:3
for k=1:16384
input(i, j, k) = i + j*1000 + k*1000*1000;
end
end
end
zzzzyyyyxxxx
index-x
index-y
index-z
----
#include "mex.h"
#include <math.h>
#include <stdio.h>
// Program test for input
// usage:
/*
* MATLAB code
clear all;
input = zeros(32, 3, 16384);
for i=1:32
for j=1:3
for k=1:16384
input(i, j, k) = i + j*1000 + k*1000*1000;
end
end
end
*/
// mex test4.c
// test4(input)
// note: type all commands above in Matlab Command Window
#define TWO_D_INDEX(d_x, d_y, x, y) (x + y*d_x)
#define THREE_D_INDEX(d_x, d_y, d_z, x, y, z) (x + y*d_x + z*d_x*d_y)
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int i, j, k;
// input
int input_num_of_dimensions;
int *input_dim;
double *in; // pointer to process content of the input
int input_dim_x;
int input_dim_y;
int input_dim_z;
int desired_index_x = 32 -1;
int desired_index_y = 3 -1;
int desired_index_z = 160 -1;
int index_desired;
/* -------------------------------- */
/* NECESSARY: dimension & data pointer for input */
in = mxGetPr(prhs[0]); // get data pointer
// Input dimension processing
input_num_of_dimensions = mxGetNumberOfDimensions(prhs[0]);
input_dim = mxGetDimensions(prhs[0]);
// print dimension information
printf("Number of dimensions of the input: %d\n", input_num_of_dimensions);
for(i=0; i<input_num_of_dimensions; i++)
printf("Length of dimension #%d is %d\n", i+1, input_dim[i]);
// specify the length of dimension x, y, and z
input_dim_x = input_dim[0];
input_dim_y = input_dim[1];
input_dim_z = input_dim[2];
/* -------------------------------- */
index_desired = THREE_D_INDEX(
input_dim_x, input_dim_y, input_dim_z,
desired_index_x, desired_index_y, desired_index_z);
printf("%f\n", in[index_desired]);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.236.184
1F:推 sunev:顺带一提...matlab有内建指令ind2sub及sub2ind 05/19 15:00
※ 编辑: lihgong 来自: 140.113.236.184 (05/20 17:10)