如何在CoreML中访问MLMultiArray中的元素

kid*_*abr 1 machine-learning objective-c multidimensional-array ios coreml

我已经初始化MLMultiArray使用initWithDataPointer,如下面的代码所示:

float count = 512 * 384;
  double *tempBuffer = malloc(count * sizeof(double));
  NSError *error = NULL;
  NSArray *shape = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:512],[NSNumber numberWithInt:384], nil];
  NSArray *stride = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:1],[NSNumber numberWithInt:1], nil];

  MLMultiArray *mlMultiArray = [[MLMultiArray alloc] initWithDataPointer:tempBuffer
                                                                   shape:shape
                                                                dataType:MLMultiArrayDataTypeDouble
                                                                 strides:stride
                                                             deallocator:^(void * _Nonnull bytes) { free(bytes); }
                                                                   error:&error];
Run Code Online (Sandbox Code Playgroud)

根据MLMultiArray链接中提到的文档,subscript需要使用它来访问元素.

如果我按照显示的方式访问元素,是否正确?

NSNumber *val = [mlMultiArray objectForKeyedSubscript:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:1],[NSNumber numberWithInt:1], nil]];
Run Code Online (Sandbox Code Playgroud)

Mat*_*ans 6

我建议你使用mlMultiArray.dataPointer,转换它double *,然后直接访问数据缓冲区的内容.您可以计算元素i, j, k使用步幅的位置:

double *ptr = (double *) mlMultiArray.dataPointer;
NSInteger offset = i*stride[0].intValue + j*stride[1].intValue + k*stride[2].intValue;
double val = ptr[offset];
Run Code Online (Sandbox Code Playgroud)