我正在研究一个问题,即我有多个数组要与单个数组进行比较。将返回索引之间跨度最短的数组。
以下是我将使用的一组数组的示例:
(如果它们具有任何重要性,则这些值代表RGB值)
int[] workingset = {55, 34,102};
int[] test1 = {54,36,99};`
int[] test2 = {21,65,231};
int[] test3 = {76,35,1};
int[] test4 = {133,22,3};
由于test1[]
值最接近workingset[]
,test1[]
将是要返回的数组。
*我为没有提供示例代码而道歉,但我根本想不出将这个难题拼凑在一起的方法。
答案 0 :(得分:1)
您可以轻松总结所有组件(r,g,b)并检查哪个组件具有最小差异。
#include <iostream>
int main(int argc, char* args[])
{
int workingset [] = {55, 34,102};
int test1 [] = {54,36,99};
int test2 []= {21,65,231};
int test3 [] = {76,35,1};
int test4 [] = {133,22,3};
int sums [4] = {};
for(int i=0; i<3;++i){
sums[0] += abs(test1[i]-workingset[i]);
}
std::cout << "diff test1 " << sums[0] << std::endl;
for(int i=0; i<3;++i){
sums[1] += abs(test2[i]-workingset[i]);
}
std::cout << "diff test2 " << sums[1] << std::endl;
for(int i=0; i<3;++i){
sums[2] += abs(test3[i]-workingset[i]);
}
std::cout << "diff test3 " << sums[2] << std::endl;
for(int i=0; i<3;++i){
sums[3] += abs(test4[i]-workingset[i]);
}
std::cout << "diff test4 " << sums[3] << std::endl;
int smallestIndex = 0;
int smallestDiff = INT_MAX;
for(int i=0; i< 4; i++){
if(sums[i] < smallestDiff){
smallestIndex = i;
smallestDiff = sums[i];
}
}
std::cout << "array with smallest index: " << smallestIndex << std::endl;
return 0;
}
我编辑了microsoft特定的包含和数据类型。
答案 1 :(得分:0)
“指数之间的最短跨度”的指标是什么?我猜你在试图最小化两个数组之间差异的绝对值之和?
一旦定义了指标,请尝试使用此伪代码:
min_metric = MAX_INT
min_array = null
for array in arrays:
if array.length() == workingset.length():
metric = calculateMetric(workingset, array)
if metric < min_metric:
min_metric = metric
min_array = array
答案 2 :(得分:0)
我也猜。假设您正在尝试编写颜色匹配器。考虑这些数组向量。然后,workingset
和testX
之间的向量差的绝对长度将是要使用的度量。
或在代码中:
int [] delta = { 0, 0, 0 };
for (int i = 0; i < delta.length; ++i) delta[i] = workingset[i] - testX[i];
double metric = 0;
for (int x: delta) metric += x * x;
metric = sqrt(metric); // and use this to assess how far away the testX color is from the workingset color (sqrt operation is optional)