划分二维数组中的每个元素

Divide every element in 2 dimensional array

我有 x 和 y 坐标的总和,我需要计算平均值

float [][] sums = new float[n][2];

例如我的数组包括:


{ [ 8,6 ],
  [ 4,2 ] }

除以2后:


{ [ 4,3 ],
  [ 2,1 ] }

我可以用循环来做到这一点,但我想知道是否可以用 1 个函数来做到这一点。

像这样:

Arrays.stream(sums).map(y -> Arrays.stream(y).map(x -> x/2).toArray(Double[]::new))
.toArray(Double[][]::new);

可能应该做你想做的。

您可以简单地将您的 for 循环封装到一个函数中并调用它:

import java.util.Arrays;

void setup(){

    float [][] sums = new float[][]{ { 8,6 },
                                     { 4,2 } };

    print("pre: ");
    System.out.println(Arrays.deepToString(sums));

    matMul(sums,0.5);

    print("post:");
    System.out.println(Arrays.deepToString(sums));
}

void matMul(float[][] data,float multiplier){
  for(int y = 0; y < data.length; y++){
    for(int x = 0; x < data[y].length; x++){
      data[x][y] *= multiplier;
    }
  }
}

如果您刚刚开始使用函数,这里有一些提示。

一个函数能做的最简单的事情就是封装一堆指令,但是 不允许读取来自函数外部的任何数据,并且不允许 return 任何数据输出。

这是一个非常simple/boring的例子:

void sayHello(){
  println("hello");
}

重点是熟悉语法。 函数有:

  • a (return) 类型:如果函数 return 有任何结果,它是什么类型的结果? (一个数字、一串文本、一个对象等),如果不是,它只是 void
  • 一个名字(这样我们就可以称呼它)
  • 括号内的参数(0 个或更多),每个参数都有类型和名称(类似于局部变量)
  • {} 符号定义的正文:此块中定义的所有内容仅对该块可见(return 编辑的内容除外,如果有的话)。这被称为函数范围

您可能已经定义了没有 return 结果的函数:void setup(){}void draw(){}

您之前可能已经调用过函数:在括号中使用了名称和参数(如果有的话)(例如 println("hi");point(50,50);noCursor(); 等)

这是一个简单的函数示例,它接受两个输入和 return一个输出:输入的总和:

int sum(int a, int b){
  return a+b;
}

而不是 void 我们 return 类型的结果是 int 并且参数是一对名为 a 和 b 的整数。唯一额外的东西是用于(你猜对了)return 结果(并退出功能块)的 return 关键字。

这里是调用函​​数的基本示例:

void setup(){
  println(add(2,2));
  println(add(4,4));
}

int add(int a, int b){
  return a + b;
}

如果您想阅读更多内容,请查看 Kevin Workman's Creating Functions Processing Tutorial

切记 void 方法转换数组引用以作为参数传递给函数。在某些情况下,您不想更改输入数据,但 return 结果。在这种情况下,您可以事先复制数组并传递一个副本,或者拥有一个为您制作副本的函数版本:

import java.util.Arrays;

void setup(){

    float [][] sums = new float[][]{ { 8,6 },
                                     { 4,2 } };

    print("sums:    ");
    System.out.println(Arrays.deepToString(sums));

    float[][] result = matMul(sums,0.5);

    print("result:  ");
    System.out.println(Arrays.deepToString(result));

    print("original:");
    System.out.println(Arrays.deepToString(sums));
}

float[][] matMul(float[][] data,float multiplier){
  // check input data
  if(data == null || data.length == 0){
    println("no data to multiply, returning null");
    return null;
  }
  // make another array of the same shape
  float[][] result = new float[data.length][data[0].length];
  // do the multiplcation, storing the result into the duplicate array
  for(int y = 0; y < data.length; y++){
    for(int x = 0; x < data[y].length; x++){
      result[x][y] = data[x][y] * multiplier;
    }
  }
  // return the result
  return result;
}

注意函数开始时的一些检查:一般来说,验证传入的数据是个好主意,以防万一,并显示一条消息,以便轻松解决问题(无需花费太多找出错误的含义)。