有没有办法c++
在内置数组的末尾添加一个元素?也就是说,函数的push_back
模拟std::vector
?
zolars's questions
请帮助加快此任务的代码:
同步(20 分)
一组 n 颗卫星位于坐标线上的坐标为 1、2、...n 的点处。每颗卫星的特征在于它产生的信号的功率 pi。如果 xi 点处的卫星具有信号强度 pi,则位于不大于 pi 距离处的所有卫星都可以接收到来自该卫星的信号。卫星本身不接收它的信号。
为了同步工作,所有卫星同时将它们的信号发送到它们的信号到达的所有其他卫星。每颗卫星都需要确定它从多少其他卫星接收到信号。
输入格式
第一行包含数字 n - 卫星数量,2 ≤ n ≤ 105。第二行包含 n 个空格分隔的整数 - 相应卫星的功率。第二条线的第 i 个位置包含位于坐标线上 i 点的卫星的功率。所有幂都是 1 到 109 之间的整数。
输出格式
输出 n 个空格分隔的数字,表征卫星在同步期间接收到的信号数量。第 i 个位置应指示位于坐标线上第 i 点的卫星接收到的信号数量。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector <int> a(n, -1);
for (int i = 0; i < n; i++){
int p;
cin >> p;
for (int j = max(0, i - p); j < min(n, i + p + 1); j++){
a[j] += 1;
}
}
for (int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
我无法理解输入数字 124145436767 时出现此错误的位置:
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: stoi: out of range
Abort trap: 6
#include <iostream>
#include <math.h>
using namespace std;
int main(){
string nn;
cin >> nn;
int n = stoi(nn), lnn = nn.size(), sn = sqrt(n) + 1;
if (nn[lnn - 1] != '2' && nn[lnn - 1] != '4' && nn[lnn - 1] != '5' && nn[lnn - 1] != '6' && nn[lnn - 1] != '8'){
for (int i = 3; i <= sn; i += 2){
if (n % i == 0){
printf("-1 -1");
return 0;
}
}
}
else {
printf("-1 -1");
return 0;
}
for (int j = -1; j >= -lnn; j -= 1){
if (j != -1){
n = stoi(nn.substr(0, lnn + j) + nn.substr(lnn + j + 1, lnn - 1));
}
else {
n = stoi(nn.substr(0, lnn - 1));
}
string nnn = to_string(n);
sn = sqrt(n) + 1;
if (nnn[lnn - 1] != '2' && nnn[lnn - 1] != '4' && nnn[lnn - 1] != '5' && nnn[lnn - 1] != '6' && nnn[lnn - 1] != '8'){
for (int i = 3; i <= sn; i += 2){
if (n % i == 0){
printf("-1 %i", lnn + j + 1);
return 0;
}
}
}
else {
printf("-1 %i", lnn + j + 1);
return 0;
}
}
for (int j = -1; j >= -lnn; j -= 1){
if (j != -1){
n = stoi(nn.substr(0, lnn + j) + nn.substr(lnn + j + 1, lnn - 1));
}
else {
n = stoi(nn.substr(0, lnn - 1));
}
string nna = to_string(n);
sn = sqrt(n) + 1;
for (int k = j; k >= lnn; k -= 1){
int na = stoi(nna.substr(0, lnn - 1));
if (k != -1){
int na = stoi(nna.substr(0, lnn + k) + nna.substr(lnn + k + 1, lnn - 1));
}
int sna = sqrt(na);
if (nna[lnn - 1] != '2' && nna[lnn - 1] != '4' && nna[lnn - 1] != '5' && nna[lnn - 1] != '6' && nna[lnn - 1] != '8'){
for (int i = 3; i <= sna; i += 2){
if (n % i == 0){
printf("%i %i", lnn + j + 1, lnn + k);
return 0;
}
}
}
}
}
}
我知道在平面上,知道向量的长度和角度,找到一个点就足够了:
x = cos(angle) * length
y = sin(angle) * length
但我不知道对空间做同样的公式。这是我所拥有的:
angle1 = something
angle2 = something
length = something
这是我需要知道的:
x = ?
y = ?
z = ?
我会很高兴得到任何帮助!
我有一个numpy
带有多边形的数组,我需要为这些多边形获取一个带有法线的数组,我找到了一种在循环中执行它的方法,但是为了速度,我想在没有循环的情况下执行它,但是我停留在法线标准化的那一刻。循环选项:
def get_normal(translated_vec):
print(translated_vec)
line1 = translated_vec[1] - translated_vec[0]
line2 = translated_vec[2] - translated_vec[0]
normal = np.array([line1[1] * line2[2] - line1[2] * line2[1],
line1[2] * line2[0] - line1[0] * line2[2],
line1[0] * line2[1] - line1[1] * line2[0]])
l = sqrt(sum(np.power(normal, 2)))
if l != 0:
normal /= l
else:
normal += 1.73205080757
return normal
translated_vec = np.array([[[ 0.07243389, -0.462265, 4.87585974],
[ 0.13487457, -0.3653465, 5.06419032],
[ 0.20468741, -0.1275775, 4.95642205]],
[[-0.0753569, -0.142866, 4.75400399],
[ 0.12289676, -0.1275775, 4.83061181],
[ 0.02365434, 0.2133755, 4.71171791]]])
while True:
for i, translated_vec in enumerate(translated_vecs):
normal = get_normal(translated_vec)
不带循环的选项:
def get_normals(translated_vec):
line1 = translated_vec[:, 1] - translated_vec[:, 0]
line2 = translated_vec[:, 2] - translated_vec[:, 0]
normal = np.cross(line1, line2)
# Здесь фрагмент на котором я застрял
sqrts = np.array([np.linalg.norm(n) for n in normal])
# l = np.linalg.norm(normal)
normal /= sqrts[:,np.newaxis]
# if l != 0:
# normal /= l
# else:
# normal += 1.73205080757
return normal
translated_vec = np.array([[[ 0.07243389, -0.462265, 4.87585974],
[ 0.13487457, -0.3653465, 5.06419032],
[ 0.20468741, -0.1275775, 4.95642205]],
[[-0.0753569, -0.142866, 4.75400399],
[ 0.12289676, -0.1275775, 4.83061181],
[ 0.02365434, 0.2133755, 4.71171791]]])
while True:
normal = get_normals(translated_vec)
输出应该是这样的:
[-0.93211486 0.33550072 0.13638602] # Нормаль первого полигона
[-0.36645627 0.20945855 0.90655222] # Нормаль второго полигона
主要问题是我不知道如何快速创建一个具有正常长度的数组,这样我就可以同时将具有法线的数组除以它们的长度,从而快速且没有循环。
我需要知道空间中两个向量形成的平面的垂直线。我在互联网上发现这可以通过3D 向量的向量乘法来计算。
在我的代码中,它看起来像这样:
def get_normal(translated_vec):
line1 = translated_vec[1] - translated_vec[0]
line2 = translated_vec[2] - translated_vec[0]
normal = np.array([line1[1] * line2[2] - line1[2] * line2[1],
line1[2] * line2[0] - line1[0] * line2[2],
line1[0] * line2[1] - line1[1] * line2[0]])
l = np.linalg.norm(normal)
if l != 0:
normal /= l
else:
normal += 1.0
return normal
输入示例:
translated_vec = np.array([[ 0.07243389, -0.462265, 4.87585974],
[ 0.13487457, -0.3653465, 5.06419032],
[ 0.20468741, -0.1275775, 4.95642205]])
它确实有效,但它工作得太慢了,我想在帮助下以某种方式加快速度numpy
,我发现那里有一个函数vdot
,但它不适合我,因为当它接收两个向量作为输入时,它输出的不是一个新的向量,而是一个数字。也就是说,我需要创建一个计算this的快速函数。
我有一个存储矩阵的数组obj
,每个矩阵都需要乘以一个矩阵projection_vec
。当程序遍历所有元素obj
并将每个元素乘以projection_vec
,然后乘法的结果就是我需要的,但是当程序一次将整个数组乘以 时obj
,projection_vec
结果略有不同,我不知道如何解决它,因为一次乘以整个数组obj
比分别迭代和乘以数组的每个元素要快,请告诉我我需要在第二个代码片段中更改什么,以便结果与第一个相同片段,但代码以与第二个片段相同的速度(甚至更快)运行。
片段 1
import numpy as np
from math import *
def matrix_multiply(inp_tri, matrix):
out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
w[w == 0] = 1.0
out_tri = out_tri / w[:, None]
return out_tri
perspective_matrix = np.array([
[(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
[0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
[0.0, 0.0, 1.0, 1.0],
[0.0, 0.0, -1.0, 0.0]
])
def get_projection(translated_vec):
projection_vec = matrix_multiply(translated_vec, perspective_matrix)
projection_vec += 1.0
projection_vec = projection_vec * H_SIZE
return projection_vec
obj = np.array([[
[0, 0, 0],
[1, 1, 1],
[-2, -2, 2]
],
[
[1, 1, 1],
[0, 1, 2],
[-2, -2, -2]
]])
drawig_obj = []
for i, translated_vec in enumerate(obj):
translated_vec = get_projection(translated_vec)
drawing_obj.append(translated_vec)
print(drawing_obj)
输出:
[(array([[ nan, nan, -inf],
[ 1.28000000e+03, 1.00000000e+03, 1.00000000e+00],
[-1.42108547e-13, -2.80000000e+02, 1.50000000e+00]]), (255, 255, 255)), (array([[1.28e+03, 1.00e+03, 1.00e+00],
[6.40e+02, 6.80e+02, 1.50e+00],
[1.28e+03, 1.00e+03, 2.50e+00]]), (255, 255, 255))]
片段 2
import numpy as np
from math import *
def matrix_multiply(inp_tri, matrix):
out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
w[w == 0] = 1.0
out_tri = out_tri / w[:, None]
return out_tri
perspective_matrix = np.array([
[(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
[0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
[0.0, 0.0, 1.0, 1.0],
[0.0, 0.0, -1.0, 0.0]
])
def get_projection(translated_vec):
projection_vec = matrix_multiply(translated_vec, perspective_matrix)
projection_vec += 1.0
projection_vec = projection_vec * H_SIZE
return projection_vec
obj = np.array([[
[0, 0, 0],
[1, 1, 1],
[-2, -2, 2]
],
[
[1, 1, 1],
[0, 1, 2],
[-2, -2, -2]
]])
projection_vecs = get_projection(obj)
print(projection_vecs)
输出:
[(array([[ 6.40e+02, 3.60e+02, 5.00e-01],
[ 1.28e+03, 1.00e+03, 1.00e+00],
[-6.40e+02, -9.20e+02, 1.50e+00]]), (255, 255, 255)), (array([[ 1.28e+03, 6.80e+02, 1.00e+00],
[ 6.40e+02, 6.80e+02, 5.00e-01],
[-6.40e+02, -2.80e+02, 2.50e+00]]), (255, 255, 255))]
我需要将二维数组的元素分成一维数组的元素。IE。:
a = np.array([
[1, 2, 3],
[6, 9, 8],
[14, 3, 4],
[0, 1, 9]
])
b = np.array([
[1, 2, 3, 4]
])
有必要为数组的每个第一个元素划分每个第一i
个子数组的元素,即a
i
b
a[0] = a[0] / b[0]
a[1] = a[1] / b[1]
a[2] = a[2] / b[2]
a[3] = a[3] / b[3]
但没有枚举,没有循环,所以它是美丽的和numpy
evski