划分二维数组中的每个元素
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;
}
注意函数开始时的一些检查:一般来说,验证传入的数据是个好主意,以防万一,并显示一条消息,以便轻松解决问题(无需花费太多找出错误的含义)。
我有 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;
}
注意函数开始时的一些检查:一般来说,验证传入的数据是个好主意,以防万一,并显示一条消息,以便轻松解决问题(无需花费太多找出错误的含义)。