给定一堆任意向量(存储在矩阵A中)和半径r,我想找到落在半径r球内的那些向量的所有整数值线性组合.然后我将存储在矩阵V中的必要坐标.例如,如果是线性组合
K=[0; 1; 0]
Run Code Online (Sandbox Code Playgroud)
在我的球体内部,即类似的东西
if norm(A*K) <= r then
V(:,1)=K
end
Run Code Online (Sandbox Code Playgroud)
等等
A中的向量肯定是给定晶格的最简单可能的基础,最大的向量将具有长度1.不确定是否以任何有用的方式限制向量但我怀疑它可能. - 他们不会像不太理想的基础那样有相似的指示.
我已经尝试了一些方法,但没有一个看起来特别令人满意.我似乎无法找到一个漂亮的模式来穿越晶格.
我目前的方法涉及从中间开始(即所有0的线性组合)并逐个经过必要的坐标.它涉及存储一堆额外的矢量来跟踪,所以我可以遍历坐标的所有八分圆(在3D情况下)并逐个找到它们.这个实现看起来非常复杂并且不够灵活(特别是它似乎不容易推广到任意数量的维度 - 虽然这对于当前目的来说并不是绝对必要的,但它是一个很好的选择)
有没有一个很好的方法来找到所有必需的点?
(*理想情况下既高效又优雅**.如果真的有必要的话,在球体之外有一些额外的点数并不重要,但最好不要那么多.我绝对需要球体内的所有向量. - 如果它有很大的不同,我对3D案例最感兴趣.
**我很确定我当前的实现都不是.)
我发现类似的问题:
找到围绕任意坐标的半径为r的球体中的所有点 - 这实际上是比我正在寻找的更普遍的情况.我只处理周期性格子,我的球体总是以0为中心,与格子上的一个点重合.但我没有一个点列表,而是一个矢量矩阵,我可以用它来生成所有点.
如何有效地枚举n维网格中的所有球体点 - 完全规则的超立方格子和曼哈顿距离的情况.我正在寻找完全任意的格子和欧氏距离(或者,为了效率目的,显然是正方形).
我需要生成一个有100x100节点的常规图形(也称为网格网络).我开始使用10x10以下代码绘制图形:
import numpy
from numpy import *
import networkx as nx
from networkx import *
import matplotlib.pyplot as plt
G=nx.grid_2d_graph(10,10)
nx.draw(G)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但我得到的是这个:
有没有办法摆脱输出的这种旋转效应?我的最终网络看起来像棋盘,就像这样(请忽略标签):
此外,我需要为每个节点提供其ID,范围从0到9999(在100x100网络的情况下).任何想法将不胜感激!
我需要找到多边形内部和多边形上的所有格点。
输入:
from shapely.geometry import Polygon, mapping
sh_polygon = Polygon(((0,0), (2,0), (2,2), (0,2)))
Run Code Online (Sandbox Code Playgroud)
输出:
(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)
Run Code Online (Sandbox Code Playgroud)
请建议是否有办法在使用或不使用 Shapely 的情况下获得预期结果。
我编写了这段代码,它给出了多边形内部的点,但它没有给出多边形上的点。还有更好的方法来做同样的事情:
from shapely.geometry import Polygon, Point
def get_random_point_in_polygon(poly):
(minx, miny, maxx, maxy) = poly.bounds
minx = int(minx)
miny = int(miny)
maxx = int(maxx)
maxy = int(maxy)
print("poly.bounds:", poly.bounds)
a = []
for x in range(minx, maxx+1):
for y in range(miny, maxy+1):
p = Point(x, y) …Run Code Online (Sandbox Code Playgroud) 例如,如果我有一个如下所示的晶格:
133.1
/
121
/ \
110 108.9
/ \ /
100 99
\ / \
90 89.1
\ /
81
\
72.9
Run Code Online (Sandbox Code Playgroud)
格子从100开始,并且要么以1.1的系数上升,要么以0.9的系数下降.这个晶格有3个周期,它上升或下降.很明显,这个矩阵可以填充更长的时间.
矩阵形式的晶格如下所示:
[,1] [,2] [,3] [,4]
[1,] 100 110 121 133.1
[2,] NA 90 99 108.9
[3,] NA NA 81 89.1
[4,] NA NA NA 72.9
Run Code Online (Sandbox Code Playgroud)
我在R.工作.生成晶格矩阵的代码如下:
#Parameters
S0 <- 100 #price at t0
u <- 1.1 #up factor
d <- 0.9 #down factor
n <- 3 #number of periods
#Matrix for the prices
prices <- matrix(data=NA, …Run Code Online (Sandbox Code Playgroud) 我有两个矩阵A和B,行数相同.考虑由B行生成的格子.我想减少B并且在减少期间相应地改变A. 也就是说,如果第i行和第j行B交换,则需要扫描A的第i行和第j行,类似地其他基本行操作.我怎么能这样做?
还有非常简单的C或C++ - LLL算法的实现?
我在编码采访中遇到了这个问题。
汉娜在格子中移动,每个点都可以用一对整数表示。她从A点移动到B点,然后向右转90度,开始移动直到到达晶格上的第一个点。找出她要达到的目标?本质上,问题归结为找到与直线垂直线相交的第一个点。有人可以提供伪代码或代码片段来说明我该如何解决吗?
algorithm geometry coordinate-systems data-structures mathematical-lattices
我有一个缠绕在圆环上的晶格(图末尾的每个节点都链接到它们在网格上的相对节点)。
require("igraph")
require("rgl")
n = 10
g = graph.lattice(c(n,n)) # create a square lattice (nxn)
plot(g,vertex.size = 0.5,vertex.size = 4,vertex.label = NA,vertex.color = "red")
# want to connect up the corners (horribly done)
v1 = seq(from =1, to = n,by = 1)
v2 = seq(from = n, to = n^2, by = n)
v3 = seq(from = n^2, to = n^2 - n+1, by = -1)
v4 = seq(from = v3[length(v3)],to = 1,by = -n)
a = cbind(rbind(v1,v2), rbind(v3,v4))
a2 …Run Code Online (Sandbox Code Playgroud)